2011-01-13 22 views
8

Tôi đang bắt đầu viết một số hợp đồng dữ liệu WCF cần phải tương thích về phía trước & có thể phiên bản. Tôi đã đọc bài báo MSDN here, và đã tự hỏi nếu có ai đã làm rõ về điểm # 14 về enums. Nó đọc như sau:WCF Versioning Enums

14. Bạn không nên thêm hoặc xóa thành viên liệt kê giữa các phiên bản. Bạn cũng không nên đổi tên thành viên liệt kê, trừ khi bạn sử dụng thuộc tính Tên trên thuộc tính EnumMemberAttribute để giữ cho tên của chúng trong mô hình hợp đồng dữ liệu giống nhau.

Đọc này, tôi lấy nó để có nghĩa là khi một enum được xuất bản (và được sử dụng bởi khách hàng), bạn không thể sửa đổi nó (anyway/remove chủ yếu) mà không vi phạm tính tương thích? (tức là điều này sẽ là thay đổi đột phá)

Ai đó có thể xác nhận điều này không?

+0

Việc thêm thành viên enum sẽ không phá vỡ chức năng nhưng sẽ xóa nếu thành viên enum đang được sử dụng. Việc thêm sẽ hữu ích nếu và chỉ khi thực hiện dịch vụ thay đổi hoặc hợp đồng dịch vụ mới được thêm vào. – hungryMind

Trả lời

8

Tôi có thể xác nhận rằng bạn có thể THÊM cho một enum đã xuất bản mà không vi phạm tính tương thích, miễn là bạn không sử dụng giá trị mới khi nói chuyện với dịch vụ. Tuy nhiên lưu ý rằng nếu bạn thực sự cố gắng gửi một lớp đến dịch vụ đang sử dụng giá trị enum mới, bạn sẽ nhận được một System.ServiceModel.CommunicationException.

There was an error while trying to serialize parameter myType. The InnerException message was 'Enum value 'x' is invalid for type 'myType' and cannot be serialized. Ensure that the necessary enum values are present and are marked with EnumMemberAttribute attribute if the type has DataContractAttribute attribute.'. Please see InnerException for more details. 
+0

Điều này có đúng không nếu dịch vụ trả về, danh sách loại enum có chứa giá trị gia tăng cho một ứng dụng khách cũ hơn? –

6

tôi khuyên bạn nên không enums gửi qua giao diện WCF. Giả sử bạn có enum sau:

[DataContract] 
public enum WeekdayEnum 
{ 
    [EnumMember] 
    Monday = 0 
} 

Nếu bạn quay trở lại enum trên WCF, mọi thứ sẽ hoạt động tốt:

[ServiceContract] 
public class Service1 
{ 
    [OperationContract] 
    public List<WeekdayEnum> GetWeekdays() 
    { 
     return new List<WeekdayEnum> { WeekdayEnum.Monday }; 
    } 
} 

Thêm vào enum mà không cập nhật tham khảo dịch vụ trong khách hàng và bạn vẫn sử dụng tốt:

[DataContract] 
public enum WeekdayEnum 
{ 
    [EnumMember] 
    Monday = 0, 
    [EnumMember] 
    Tuesday = 1 
} 

Tuy nhiên, nếu bạn trả lại giá trị gia tăng từ dịch vụ mà không cần cập nhật các tài liệu tham khảo dịch vụ khách hàng, các khách hàng di sản sẽ break:

[ServiceContract] 
public class Service1 
{ 
    [OperationContract] 
    public List<WeekdayEnum> GetWeekdays() 
    { // NetDispatcherFaultException on legacy clients that only have Monday 
     return new List<WeekdayEnum> { WeekdayEnum.Monday, WeekdayEnum.Tuesday }; 
    } 
} 

Tôi đã gặp vấn đề với điều này trong các dự án hỗ trợ khách hàng cũ là quan trọng. Các giải pháp đã được chỉ đơn giản là gửi DTOs trên WCF thay vì enums. Ví dụ. các WeekdayEnum có thể được thay thế bằng cách gửi các giá trị trên một đơn giản DTO:

[DataContract] 
public class WeekdayDto 
{ 
    [DataMember] 
    public int Id { get; set; } 

    [DataMember] 
    public string Name { get; set; } 
} 

Bằng cách này, khách hàng cũ của bạn vẫn hạnh phúc.