2009-03-23 28 views
20

Tôi đang viết dịch vụ WCF đầu tiên của mình. Tôi quyết định viết dịch vụ giống như một DLL để bắt đầu với và sau đó khía cạnh các công cụ WCF trên sau đó là nơi tôi bây giờ.WCF: MessageContract, DataContract ... Confused?

Tôi được kiến ​​trúc sư khuyên rằng tôi nên gắn vào một định dạng cụ thể cho các đối tượng tin nhắn mà tôi đã thực hiện. Tuy nhiên tôi đã sử dụng Giao diện, các loại phức tạp và danh sách của chúng trong các đối tượng tin nhắn của tôi. Tôi đang đến để thêm các thuộc tính trên và tôi nhận được một chút bối rối.

Dưới đây là ví dụ về mã của tôi.

[ServiceContract] 
public interface MyServiceContract 
{ 
    [OperationContract] 
    MyMethodResponseMessage MyMethod(MyMethodRequestMessage request); 
} 

public class MyService : MyServiceContract 
{ 
    public MyMethodResponseMessage MyMethod(MyMethodRequestMessage request) 
    { 
     //Do things 
    } 
} 

//Messages 
[MessageContract] 
public class MyMethodResponseMessage 
{ 
    [MessageBodyMember] 
    public MyMethodResponse Body { get; set; } 
} 

[DataContract] 
public class MyMethodResponse 
{ 
    [DataMember] 
    public IMyComplexTypeItem { get; set; } 

    [DataMember] 
    public List<IMyComplexType> Items { get; set; } 

    [DataMember] 
    public bool Success { get; set; } 
} 

//DTO  
public interface IMyComplexType 
{ 
    [DataMember] 
    string Identity { get; set; } 
} 

[DataContract] 
public class MyComplexType1 : IMyComplexType 
{ 
    [DataMember] 
    public virtual string Identity 
} 

Bất kỳ ai cũng có thể nhận xét về tính chính xác trong việc sử dụng MessageContract, DataContract, DataMember và Serializable etc? Bất kỳ con trỏ hoặc những sai lầm rõ ràng?

Trình serializer nào là trình xử lý tốt nhất để sử dụng? và chiến lược tốt nhất để đảm bảo tôi nhận được XML được định dạng tốt từ điều này để các khách hàng khác có thể sử dụng dịch vụ của tôi dễ dàng như thế nào?

Trả lời

15

Yêu cầu/phản hồi - số [DataContract] cũng sẽ hoạt động. Một trong những ưu điểm của hợp đồng nhắn tin là bạn có thể đặt quyền riêng tư đối với thành viên, nhưng trong nhiều trường hợp, điều này là không cần thiết. Trong những trường hợp như vậy, tôi muốn giữ hợp đồng càng đơn giản càng tốt, giống như một hợp đồng dữ liệu.

Tái serializer nào - phần lớn là yếu tố cấu hình. Theo mặc định trên http, ví dụ, nó sẽ là DataContractSerializer. Tuy nhiên, tôi không chắc chắn rằng danh sách IMyComplexType sẽ hoạt động rất tốt. Bạn có thể thử, nhưng nói chung nó muốn các loại cụ thể. Lưu ý rằng với các lớp cơ sở, bạn có thể sử dụng [KnownType] để chỉ định các loại phụ được phép. Lưu ý rằng không giống như XmlSerializer, nó không phải là yêu cầu cho các thành viên bộ sưu tập có setters - mặc dù bạn có thể cần phải thêm một phương thức gọi lại OnDeserializing để khởi tạo danh sách nếu bạn làm điều đó (WCF không gọi hàm tạo).

Ngoài ra: bạn cũng có thể sử dụng protobuf-net với hợp đồng dữ liệu và WCF (miễn là họ có Thứ tự rõ ràng); điều này được đóng gói dày đặc hơn so với xml thông thường. Nó không có hỗ trợ cho các hợp đồng tin nhắn vào lúc này, mặc dù.

+0

Nhờ Marc, bạn nói đúng về lớp Base. Nó hoạt động tốt hơn một chút. Tôi sẽ xem xét phương pháp OnDeserializing, cổ vũ cho những người đứng đầu về điều đó. Tôi đang bị ràng buộc với Xml cho điều này bằng cách thiết kế. –

2

Mặc dù không phải là một câu trả lời trực tiếp câu hỏi của bạn, nó là giá trị để có một lưu ý những điều sau đây từ MSDN -Using Message Contracts

Mỗi tiêu đề thư và nội dung thư phần cá nhân được đăng (biến thành XML) sử dụng tuần tự chọn công cụ cho hợp đồng dịch vụ nơi thông báo được sử dụng. Động cơ serialization mặc định, XmlFormatter, có thể xử lý bất kỳ loại mà có một hợp đồng dữ liệu, hoặc rõ ràng (bằng cách có hệ thống. Runtime. Serialization. DataContractAttribute) hoặc ngầm (bằng cách trở thành một loại nguyên thủy, có các System.SerializableAttribute, và như vậy).

enter image description here

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