2008-09-30 10 views
6

tôi có một thư viện với một số thực thể dùng chung một giao diện. khách hàng và dịch vụ chia sẻ hội đồng này. bây giờ tôi tự hỏi nếu có một cách để có giao diện kiểu này như tham số trong hợp đồng dịch vụ của tôi để tôi có thể sử dụng cùng một phương pháp cho tất cả các lớp thực hiện giao diện.Wcf và giao diện làm thông số

các thực thể mà tất cả chúng đều được trang trí với thuộc tính datacontract và các thành viên của nó với các thuộc tính datamember.

hoàn toàn có thể? có lẽ với NetDataContractSerializer? tôi biết rằng tôi có thể làm điều đó với một lớp cơ sở (một số lớp trừu tượng ví dụ) và knowntype-nhưng tôi chắc chắn thích giao diện như nhận dạng của các đối tượng gây ra nó được sử dụng rộng rãi trong các ứng dụng khách hàng và dễ dàng phát triển.

cảm ơn

Trả lời

6

Tôi đã giải quyết sự cố bằng cách sử dụng thuộc tính ServiceKnownType tại các triển khai của OperationContracts.

Khi yêu cầu các lớp thực hiện giao diện dưới dạng ServiceKnownType, bạn có thể sử dụng giao diện làm tham số và do đó có thể sử dụng tất cả các lớp thực hiện giao diện của bạn miễn là chúng có thể tuần tự hóa được. (xem "Lập trình WCF Dịch vụ" từ Juval Löwy, trang 100)

1

Chắc chắn không thể theo "mex" thông thường. Nó có thể có thể với chia sẻ lắp ráp, nhưng tôi thực sự sẽ không khuyên bạn nên - bạn đang chiến đấu WCF: nó sẽ giòn, vv Tất nhiên, bạn luôn có thể che giấu điều này trong mô hình đối tượng của bạn - tức là thay vì gọi [ OperationContract] phương pháp trực tiếp, trừu tượng này đi vào một phương pháp wrapper giấu các chi tiết WCF (có lẽ bằng cách sử dụng các đối tượng khác nhau để chuyển dữ liệu hơn nó thực sự trả về).

0

[Tôi chỉ đọc câu trả lời của bạn và nhận ra rằng bạn đã hỏi cụ thể về tham số cho phương pháp dịch vụ. Tôi sẽ để lại ý kiến ​​của tôi ở đây trong trường hợp họ vẫn hữu ích]

gì tôi đã thực hiện các dự án mà tôi biết tôi có WCF trên cả hai mặt của dây, là một cái gì đó như:.

Một thư viện chỉ các giao diện được chia sẻ, ví dụ:

namespace SharedInterfaces { 
    public interface ICompositeType { 
     bool BoolValue { get; set; } 
     string StringValue { get; set; } 
    } 
} 

Thư viện dịch vụ WCF, nơi [DataContract] (POCO) triển khai giao diện dùng chung.

[DataContract] 
public class CompositeType : ICompositeType { 
    bool boolValue = true; 
    string stringValue = "Hello "; 

    [DataMember] 
    public bool BoolValue { 
     get { return boolValue; } 
     set { boolValue = value; } 
    } 

    [DataMember] 
    public string StringValue { 
     get { return stringValue; } 
     set { stringValue = value; } 
    } 
} 

Trong khách hàng dịch vụ, mỗi proxy POCO có thể "buộc" để thực hiện chia sẻ, triển khai, giao diện sử dụng một lớp học phần (nó sẽ anyway nếu svcutil đã làm đó là công việc một cách chính xác), và bạn sẽ có thể chương trình với giao diện trong phần còn lại của mã khách hàng của bạn:

namespace ServiceClient.ServiceReference1 { 
    public partial class CompositeType : ICompositeType { 
    } 
} 

phần này cũng rất hữu ích nếu bạn muốn thêm một số thuộc tính bổ sung hoặc các phương pháp mà khách hàng có thể tận dụng (khái niệm ví dụ như trình bày hoặc ViewModel trong. Các mẫu MVP hoặc MVVM).

+0

+1 cho Trong máy khách dịch vụ, mỗi POCO proxy có thể được "bắt buộc" để triển khai giao diện được chia sẻ, triển khai, sử dụng một lớp từng phần. –