2011-01-18 40 views
13

Trong khi tạo proxy WCF sử dụng svcutil, là nó có thể bao gồm các giao diện cũng từ đó các hợp đồng dữ liệu kế thừa, ví dụ:WCF và giao diện trên dữ liệu hợp đồng

public class SomeType: ISometype 
{ 
    public string Name { get; set; } 
} 

public interface ISometype 
{ 
    public string Name { get; set; } 
} 

Khi tôi tạo ra các proxy sử dụng này, loại SomeType được tạo ở máy khách nhưng giao diện không được tạo và cũng không có thừa kế nào. Tôi đã thử đánh dấu giao diện là DataContract nhưng thuộc tính đó không được cho phép.

Tôi có thể làm những gì tôi đang cố gắng làm không?

Trả lời

21

WCF sử dụng nhắn tin đăng, và tất cả những thông điệp cần để có thể được tuần tự sử dụng một DataContractSerializer hoặc một XmlSerializer. Và những thông điệp giữa khách hàng và máy chủ cần phải được thể hiện trong lược đồ XML.

Bây giờ, lược đồ XML không biết gì về giao diện - tất cả đều là về các loại cụ thể, thực tế. Đối với một kịch bản thông thường mà khách hàng của bạn có thể là bất cứ thứ gì từ .NET đến PHP thành Ruby (bất kỳ), bạn cần đảm bảo thể hiện mọi thứ bạn muốn gửi giữa máy khách và máy chủ theo cách có thể được biểu diễn trong lược đồ XML - giao diện không thể. Vì vậy, không có cách nào để hỗ trợ điều này trong một kịch bản mục đích chung.

Nếu bạn đang kiểm soát cả hai đầu của dây, ví dụ: bạn viết cả máy khách và máy chủ, và cả trong .NET, sau đó bạn có thể làm điều này:

  • đặt DataContracts của bạn (và ServiceContracts và OperationContracts của bạn và FaultContracts) tất cả vào một riêng biệt MyServiceContracts lắp ráp

  • tham chiếu đến việc lắp ráp từ cả mã phía dịch vụ của bạn, cũng như máy khách. Trong trường hợp đó, khi bạn đi về để tạo ra các proxy khách hàng, những loại bạn đề cập đã có mặt và WCF hạnh phúc sẽ tái sử dụng những loại từ hội đồng đó. Và vì đó là một assembly .NET mà bạn đang tham chiếu, bạn có thể có bất cứ thứ gì trong đó .NET hỗ trợ - bao gồm các giao diện.

+0

Cảm ơn marc_s Tôi sẽ thử phương pháp này. – ganeshran

+0

Cảm ơn lời giải thích marc_s, tôi cho rằng ganeshran đang xem xét một trường hợp tương tự với bản thân mình. Mục tiêu không phải là để vượt qua một thể hiện của foo thực hiện ISometype đến máy chủ thông qua các phương pháp dịch vụ, những gì tôi muốn làm là tránh phụ thuộc cụ thể trong người tiêu dùng của dịch vụ; mà không cần phải sao chép tất cả các đối tượng trong một lớp khác và có ánh xạ vô tận (automapper hoặc cách khác), dịch vụ tôi đang tiêu thụ có hàng trăm kiểu và hàng nghìn thuộc tính. – RobD

2

Bạn có thể kế thừa từ các lớp thực hiện ISometype và thêm nó vào serialization sử dụng KnownType thuộc tính:

Can I force svcutil.exe to generate data contracts for a WCF service?

+0

Cảm ơn Artem, nhưng sở thích của tôi là có các loại được tạo cũng triển khai ISomeType giao diện. Tôi không nghĩ rằng KnownTypes sẽ cung cấp chức năng đó. – ganeshran

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