2010-08-08 27 views
7

Tôi đã chuyển đổi dịch vụ web của mình sang dịch vụ wcf có một số thuật toán dữ liệu. Như một thực hành tốt nhất, nó được đề cập và khuyến khích rằng DataContracts nên kế thừa từ IExtensibleDataObject. Tôi nhận được điểm rằng trong trường hợp bổ sung hoặc loại bỏ các datamembers, IExtensibleDataObject là hữu ích. Nhưng tôi không thể có được làm thế nào các khách hàng sẽ truy cập các datamembers bị loại bỏ. Đây là mã của tôi:Sử dụng IExtensibleDataObject trong ứng dụng khách

[ServiceContract(Namespace = "http://mycompany.com/2010/08/")] 
public class MyWebService { 
    [OperationContract] 
    public Employee Add(Employee emp) 
    { 
     // Some Processing 
    } 
} 

[DataContract(Name = "Employee", Namespace = "http://mycompany.com/2010/08/")] 
public class Employee : IExtensibleDataObject { 
    [DataMember] public string FirstName; 
    [DataMember] public string LastName; 

    public ExtensionDataObject ExtensionData { get; set; } 
} 

Bây giờ trong phiên bản tiếp theo của tôi về dịch vụ web tôi đã thực hiện một số thay đổi để DataContract như

[DataContract(Name = "Employee", Namespace = "http://mycompany.com/2010/09/")] 
public class Employee : IExtensibleDataObject { 
    [DataMember] public string FirstName; 
    [DataMember] public string LastName; 
    [DataMember(IsRequired = true)] public string MiddleName; 

    public ExtensionDataObject ExtensionData { get; set; } 
} 

Tuy nhiên khách hàng của tôi mà được truy cập vào phiên bản cũ của tôi về dịch vụ web hiện đang nhận được lỗi vì không cung cấp trường MiddleName. Tôi vẫn còn bối rối cho việc sử dụng IExtensionDataObject.

Trả lời

12

Tôi sợ rằng không phải là sử dụng chính xác IExtensibleDataObject, giao diện IExtensibleDataObject được thiết kế để hỗ trợ phiên bản tròn vấp ngã, có một chi của bài viết này MSDN về tính tương thích:

http://msdn.microsoft.com/en-us/library/ms731083.aspx

Và đây là một bài viết về thực hành tốt nhất về hợp đồng dữ liệu phiên bản nói chung: http://msdn.microsoft.com/en-us/library/ms733832.aspx

+1

Điều gì không chính xác? .NET tạo ra trường sao lưu tự động - và tài liệu của Microsoft không giải thích tại sao nó cần phải là ảo và tại sao nó cần trường sao lưu theo cách thủ công được chỉ định. – ShadowChaser

11

sử dụng IExtensibleDataObject không chính xác. Bạn đã sửa đổi hợp đồng dữ liệu ở phía máy chủ, bạn đã đánh dấu trường mới là bắt buộc để có nghĩa là bạn đã bị hỏng phiên bản và không có gì giúp bạn.

IExtensibleDataObject là dành cho mục đích khác. Giả sử rằng bạn đã sửa đổi máy khách của mình sao cho hợp đồng dữ liệu trên máy khách chứa MiddleName. Bây giờ bạn đặt tên miền và sử dụng thêm dịch vụ hoạt động. Giá trị nào của MiddleName sẽ được trả về đối tượng Employee? Nếu bạn không sử dụng IExtensibleDataObject giá trị sẽ là null, nếu bạn sử dụng IExtensibleDataObject giá trị sẽ giống như bạn đặt thành tham số đầu vào.

Khi sử dụng DataContractSerializer WCF sẽ loại bỏ tất cả các tham số không được hiểu. IExtensibleDataObject tránh điều này bằng cách lưu trữ tất cả các tham số đó trong bộ sưu tập đặc biệt và gửi chúng trở lại máy khách.

Nếu bạn muốn sử dụng phiên bản hợp đồng, hãy quên đi các trường bắt buộc. Đó là điều đầu tiên sẽ phá vỡ nó.

Trân trọng, Ladislav

0

Làm cho Thuộc tính tiện ích mở rộng "Virtual" như được hiển thị bên dưới:

public virtual ExtensionDataObject ExtensionData 
{ 
    get { return theData; } 
    set { theData = value; } 
} 
Các vấn đề liên quan