2009-01-22 29 views
6

Ứng dụng của tôi có 2 "dịch vụ", giả sử một là một máy tính cơ bản (số nguyên) và một là một máy tính dấu chấm động. Tôi thể hiện những giao diện này dưới dạng như vậy:WCF và giao diện thừa kế - Đây có phải là một điều khủng khiếp để làm?

public interface IBasicCalculator 
{ 
    int Add(int a, int b); 
} 

public interface IFloatingPointCalculator 
{ 
    double Add(double a, double b); 
} 

Tôi muốn hiển thị chúng thông qua WCF. Thật không may WCF dường như gắn chặt với khái niệm rằng mọi hoạt động có thể bạn muốn phơi bày phải trải qua một giao diện dịch vụ duy nhất - bạn không thể chia sẻ các phiên giữa các dịch vụ, nó cồng kềnh từ phía máy khách khi bạn cần tạo proxy riêng biệt cho mỗi người, dường như không có bất kỳ "dịch vụ phụ" nào, v.v ...

Vì vậy, tôi đã thu thập được rằng tôi cần trình bày một giao diện "kết hợp" (người ta cũng có thể gọi nó là một mặt tiền), như thế này:

[ServiceContract] 
public interface ICalculatorService : IBasicCalculator, IFloatingPointCalculator 
{ 
    [OperationContract(Name = "AddInt")] 
    new int Add(int a, int b); 

    [OperationContract(Name = "AddDouble")] 
    new double Add(double a, double b); 
} 

Nếu tôi làm điều này, sau đó WCF cho thấy cả hai phương pháp cho khách hàng, có thể gọi cho họ, và tất cả thực sự hoạt động.

Tuy nhiên, "kế thừa giao diện" như vậy có vẻ vô ích. Riêng các newint Addnewdouble Add. Nói đúng ra, new trên một phương thức chỉ ra rằng ẩn một phương thức cơ bản, mà tôi không thực sự làm gì cả. Tôi có thể bỏ qua các new, nhưng sau đó tôi chỉ nhận được cảnh báo trình biên dịch mà số tiền "Tôi nghĩ rằng tôi đang ẩn phương pháp này, bạn cần phải đổi tên nó phương pháp hoặc đặt 'mới' vào nó".

Vì vậy, đây là một câu hỏi 2 phần:

  1. Tôi có đi đúng hướng với 'kết hợp tất cả mọi thứ vào một giao diện' logic của tôi, hoặc là có thực sự là một cách để vạch trần "sub-dịch vụ" hoặc "nhiều dịch vụ được liên kết" bằng WCF?

  2. Nếu đây là những gì cần phải làm, có cách nào tốt hơn không?

Cảm ơn!

Trả lời

4

Tôi thường nói, không. Hãy nhớ rằng, bạn đang đối phó với một công nghệ ứng dụng phân tán, không phải là một công nghệ đối tượng phân tán, vì vậy các khái niệm như kế thừa không áp dụng.

Nói chung, tôi sẽ không đi theo con đường này, mà đúng hơn, có các hợp đồng cụ thể đại diện cho các nhóm hoạt động hợp lý mà bạn muốn trưng ra thông qua điểm cuối.

8

Tôi chỉ biết rằng bạn có thể hiển thị nhiều điểm cuối (mỗi giao diện sử dụng giao diện khác nhau) cho cùng một dịch vụ và bạn vẫn chỉ cần tạo MỘT proxy proxy trên máy khách để truy cập vào tất cả chúng. hoàn toàn.

3

Tôi tin rằng những gì bạn mô tả thực sự không phải là cách thực hành tốt nhất. Chắc chắn, nó có thể thực hiện nhiều hơn một hợp đồng dịch vụ trên một loại dịch vụ, vì nó chỉ là vấn đề thực hiện nhiều giao diện.

WCF chắc chắn làm cho nó khả thi để hỗ trợ nhiều thiết bị đầu cuối giao tiếp bằng cách sử dụng các URI duy nhất và các hợp đồng độc lập. Tuy nhiên, thực tế là lớp ClientBase chỉ chấp nhận một loại giao diện hợp đồng, ví dụ, khá nhiều ngụ ý rằng các lớp proxy, ngay cả khi chúng được lưu trữ trong cùng một lib, vẫn cần thực hiện rõ ràng chỉ một giao diện hợp đồng.

Nếu bạn thực sự thành công trong việc tạo ra chỉ một định nghĩa lớp proxy, tôi rất muốn biết cách bạn quản lý để thực hiện việc này. Tôi có thể hiểu lầm nhu cầu của bạn mặc dù. Việc triển khai các lớp proxy khác nhau mang lại cho bạn sự linh hoạt tối đa bởi vì các giá trị OperationContractAtrribute như IsInitiating và IsTerminating có thể sẽ khác nhau đối với các hợp đồng khác nhau. Kết hợp các giao diện của hai hợp đồng, như trong ví dụ của bạn, có khả năng thay đổi cách bạn sẽ phân bổ các phương thức trên hợp đồng Dịch vụ.

+0

Ngẫu nhiên, tôi đang sử dụng giao diện điểm đánh dấu làm cơ sở cho tất cả các hợp đồng dữ liệu của mình. Điều này cho phép tôi xử lý chung các hợp đồng dữ liệu trong khuôn khổ WCF của tôi. –

+0

Tôi chỉ sử dụng công cụ trực quan "thêm dịch vụ tham khảo" - nó tạo ra một thư viện khách hàng - trong thư viện đó có một lớp proxy cho mỗi điểm cuối (do đó nhiều lớp trong một thư viện), nhưng tất cả các lớp "proxy" đối tượng duy nhất trên máy chủ để không quan trọng là chúng độc lập –

+0

Tuyệt vời, vì vậy, bạn đang triển khai nhiều hợp đồng dịch vụ trên một dịch vụ duy nhất. Thật tuyệt, điều đó có nghĩa là điểm gắn bó của bạn không bao giờ về số lượng proxy, nhưng thực sự là số lượng dịch vụ, và bây giờ bạn biết cách hoàn thành những gì bạn mô tả. Mát mẻ. –

Các vấn đề liên quan