2013-07-02 31 views
7

Tôi đang sử dụng .NET 4 để tạo một ứng dụng máy khách nhỏ cho khách hàng. Tôi có nên tạo một dịch vụ khổng lồ thực hiện nhiều hợp đồng (IInvoice, IPurchase, ISalesOrder, vv) hay tôi nên tạo nhiều dịch vụ chạy một hợp đồng trên mỗi cổng? Câu hỏi của tôi đặc biệt quan tâm đến ưu/nhược điểm của một trong hai lựa chọn. Ngoài ra, cách phổ biến để trả lời câu hỏi này là gì?quyết định wcf: một hợp đồng dịch vụ nhiều hoặc nhiều dịch vụ

Tình trạng khó xử thực sự của tôi là tôi không có kinh nghiệm đưa ra quyết định này và tôi có ít kinh nghiệm với wcf mà tôi cần trợ giúp để hiểu các tác động kỹ thuật của quyết định đó.

Trả lời

4

Không tạo một dịch vụ lớn triển khai số lượng hợp đồng dịch vụ. Các loại dịch vụ này dễ tạo, nhưng cuối cùng sẽ trở thành một nhức đầu bảo trì và sẽ không mở rộng tốt. Ngoài ra, bạn sẽ nhận được tất cả các loại xung đột mã nếu có một nhóm phát triển cạnh tranh để kiểm tra/kiểm tra.

Không tạo quá nhiều dịch vụ. Tránh cái bẫy làm cho các dịch vụ của bạn quá chi tiết. Cố gắng tạo các dịch vụ dựa trên một chức năng. Các phương pháp được tiếp xúc bởi các dịch vụ này cũng không nên chi tiết. Bạn nên có ít phương pháp hơn. Tránh tạo các hàm tương tự như GetUserByID (int ID), GetUserByName (tên chuỗi) bằng cách tạo một GetUser (userObject user). Bạn sẽ có ít mã hơn, bảo trì dễ dàng hơn và khả năng phát hiện tốt hơn.

Cuối cùng, bạn có thể chỉ cần một cổng bất kể bạn làm gì.

+0

Nếu sử dụng các tệp lớp/giao diện một phần để tránh xung đột hợp nhất, điều gì về đối số "sẽ không mở rộng tốt"? Nó có nghĩa là gì về mặt kỹ thuật? – Askolein

+0

@Askolein ... Nó có nghĩa là nếu bạn có quá nhiều nhồi vào một hợp đồng duy nhất nó có thể trở thành một nút cổ chai hiệu suất cũng như một nhức đầu bảo trì/mở rộng. –

+2

cảm ơn câu trả lời của bạn, nhưng câu hỏi của tôi là nhiều hơn "tại sao" nó có thể là một vấn đề hiệu suất chứ không phải "cái gì" là một vấn đề hiệu suất. Bạn nói "nút cổ chai": Tôi hiểu rằng trong ISS/WCF, mỗi yêu cầu web là một cá thể Dịch vụ mới. Nhiều yêu cầu trên một dịch vụ lớn duy nhất sẽ vẫn là nhiều phiên bản, không phải là một phiên bản phục vụ tất cả chúng. Vì vậy, không có vấn đề mở rộng quy mô. Đây có phải là lý do đúng không? – Askolein

1

Có vẻ như bạn đang trộn giữa DataContract (s) và ServiceContract (s). Bạn có thể có một ServiceContract và nhiều DataContract (s) và điều đó hoàn toàn phù hợp với nhu cầu của bạn.

2

Trong các ứng dụng thời gian thực bạn có một hợp đồng dịch vụ cho từng đối tượng như Invoice, Mua SalesOrder sẽ có ServiceContract riêng

Tuy nhiên đối với mỗi hợp đồng dịch vụ sẽ có khách hàng không đồng nhất như hóa đơn sẽ được gọi bởi backoffice qua cửa sổ ứng dụng sử dụng netNamedPipeBinding hoặc netTcpBinding và ứng dụng máy khách cùng thời gian cần phải gọi dịch vụ bằng cách sử dụng basicHttpBinding hoặc wsHttpBindings. Về cơ bản bạn cần tạo nhiều điểm cuối cho mỗi dịch vụ.

0

Bạn nên đưa ra quyết định dựa trên tải dự kiến, khả năng mở rộng cần thiết và quan điểm trong tương lai. Như bạn đã viết "ứng dụng máy chủ ứng dụng khách nhỏ cho một khách hàng", nó không đưa ra ý tưởng rõ ràng về việc sử dụng dự định phát triển trong tay. Câu trả lời của ông Big cũng phải được xem xét.

Bạn được chào đón nhiều nhất để đưa ra thêm câu hỏi được hỗ trợ với dữ liệu cụ thể hoặc thông tin cụ thể về tình hình trong tay. Cảm ơn.

2

Bạn thường sẽ tạo các dịch vụ khác nhau cho từng thực thể chính như IInvoice, IPurchase, ISalesOrder.

Tùy chọn khác là phân tách truy vấn từ các lệnh. Bạn có thể có một dịch vụ lệnh cho mỗi thực thể chính và thực hiện các hoạt động nghiệp vụ chỉ chấp nhận dữ liệu mà họ cần để thực hiện thao tác (tránh các hoạt động giống CRUD); và một dịch vụ truy vấn trả về dữ liệu theo định dạng mà khách hàng yêu cầu. Điều này có nghĩa là phần lệnh sử dụng mô hình miền/lớp nghiệp vụ cơ bản; trong khi dịch vụ truy vấn trực tiếp hoạt động trên cơ sở dữ liệu (bỏ qua doanh nghiệp, không cần thiết cho truy vấn). Điều này đơn giản hóa việc truy vấn của bạn rất nhiều và làm cho nó trở nên linh hoạt hơn (chỉ trả lại những gì khách hàng cần).

0

Sự thật là chia nhỏ dịch vụ WCF - hoặc bất kỳ dịch vụ nào là hành động cân bằng.Nguyên tắc là bạn muốn giữ áp lực giảm về độ phức tạp trong khi vẫn xem xét hiệu suất.

Bạn càng tạo ra nhiều dịch vụ hơn, bạn càng phải viết nhiều cấu hình hơn. Ngoài ra, bạn sẽ tăng số lượng lớp proxy mà bạn cần tạo và duy trì ở phía máy khách.

Đặt quá nhiều ServiceContracts trên một dịch vụ sẽ tăng thời gian cần thiết để tạo và sử dụng proxy. Nhưng, nếu bạn chỉ kết thúc với một hoặc hai hoạt động trên một hợp đồng, bạn sẽ có thêm phức tạp cho hệ thống với rất ít để đạt được. Đây không phải là một toa thuốc khoa học, nhưng một nguyên tắc nhỏ có thể nói về 10-20 OperationContracts trên ServiceContract.

Khớp nối lớp học tất nhiên là một sự cân nhắc, nhưng bạn có thực sự xử lý các mối quan tâm riêng biệt không? Nó phụ thuộc vào những gì hệ thống của bạn làm, nhưng hầu hết các hệ thống chỉ đối phó với một vài lĩnh vực quan tâm, vì vậy việc chia nhỏ mọi thứ có thể không thực sự làm giảm sự ghép nối của lớp.

Một điều khác cần nhớ và điều này cực kỳ quan trọng là luôn luôn làm cho các phương pháp của bạn trở nên chung chung nhất có thể. WCF giao dịch trong DataContracts vì một lý do. DataContracts có nghĩa là bạn có thể gửi bất kỳ đối tượng nào đến và đi từ máy chủ, miễn là DataContracts được biết đến.

Vì vậy, ví dụ, bạn có thể có 3 OperationContracts:

[OperationContract] 
Person GetPerson(string id); 

[OperationContract] 
Dog GetDog(string id); 

[OperationContract] 
Cat GetCat(string id); 

Nhưng, quá lâu vì đây là tất cả các loại nổi tiếng, bạn có thể hợp nhất các trong một hoạt động như:

[OperationContract] 
IDatabaseRecord GetDatabaseRecord(string recordTypeName, string id); 

Cuối cùng, đây là điều quan trọng nhất cần xem xét khi thiết kế các hợp đồng dịch vụ. Điều này áp dụng cho REST nếu bạn đang sử dụng một serialization DataContract như phương pháp serialization.

Cuối cùng, quay lại Dịch vụ của bạnViệc liên tục vài tháng một lần và xóa các hoạt động không được khách hàng sử dụng. Đây là một cái khác lớn!