2008-10-09 28 views
47

Tôi có vài ứng dụng khác nhau trong số đó tôi muốn chia sẻ một C# enum. Tôi không thể tìm ra cách để chia sẻ một tuyên bố enum giữa một ứng dụng thường xuyên và một dịch vụ WCF.Chia sẻ Enum với Dịch vụ WCF

Đây là tình huống. Tôi có 2 ứng dụng C# destop nhẹ và một webservice WCF mà tất cả đều cần chia sẻ các giá trị enum.

khách hàng 1 có

Method1(MyEnum e, string sUserId); 

Khách hàng 2 có

Method2(MyEnum e, string sUserId); 

Webservice có

ServiceMethod1(MyEnum e, string sUserId, string sSomeData); 

My ban đầu mặc dù là tạo ra một thư viện gọi Common.dll để đóng gói các enum và sau đó chỉ cần tham khảo thư viện đó trong tất cả các dự án trong đó enum là cần thiết. Tuy nhiên, WCF làm cho mọi thứ trở nên khó khăn vì bạn cần đánh dấu enum để nó trở thành một phần không thể thiếu của dịch vụ. Như thế này:

[ServiceContract] 
[ServiceKnownType(typeof(MyEnum))] 
public interface IMyService 
{ 
    [OperationContract] 
    ServiceMethod1(MyEnum e, string sUserId, string sSomeData); 
} 

[DataContract] 
public enum MyEnum{ [EnumMember] red, [EnumMember] green, [EnumMember] blue }; 

Vậy .... Có cách nào để chia sẻ enum giữa dịch vụ WCF và các ứng dụng khác không?

+0

Bạn nên tránh các enums trong các dịch vụ web vì chúng tạo ra các vấn đề tương thích ngược về tinh tế. Xem http://stackoverflow.com/a/788281/52277 –

+1

Không áp dụng trong trường hợp này; các vấn đề tương thích ngược được gọi là do * trả lại * một enum cho một khách hàng (mà rất rõ ràng có thể phá vỡ chúng) so với tham gia một enum như đầu vào. –

Trả lời

45

Sử dụng thư viện chung sẽ không sao. Các liệt kê được tuần tự hóa và các thuộc tính DataContract không cần thiết.

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

loại Enumeration. Các bảng liệt kê, bao gồm cả các bảng liệt kê cờ, là có thể tuần tự hóa. Tùy chọn, loại liệt kê có thể được đánh dấu bằng DataContractAttribute thuộc tính , trong trường hợp mà mỗi thành viên đó tham gia serialization phải được đánh dấu bằng EnumMemberAttribute thuộc tính

EDIT: Mặc dù vậy, không nên có vấn đề với việc có enum được đánh dấu là một DataContract và có thư viện khách hàng sử dụng nó.

+4

Bạn nên tránh enums trong webservices vì ​​chúng tạo ra các vấn đề tương thích ngược về tinh tế. Xem http://stackoverflow.com/a/788281/52277 –

0

bạn có thể gán giá trị cho các thành viên int Enum của bạn và chỉ sử dụng int cho chuyển nhượng và khi cần thiết đúc chúng trở lại thành kiểu Enum bạn

+4

Làm mất mục đích của enum. – Gaui

33

tôi phải có một số vấn đề với một tài liệu tham khảo phục vụ đã lỗi thời hoặc một cái gì đó. Tôi quay lại và tạo một thư viện chung chứa enum, và mọi thứ đều hoạt động tốt. Tôi chỉ cần thêm một tham chiếu sử dụng vào tệp của giao diện dịch vụ.

using Common; 

[ServiceContract] 
[ServiceKnownType(typeof(MyEnum))] 
public interface IMyService 
{ 
    [OperationContract] 
    ServiceMethod1(MyEnum e, string sUserId, string sSomeData); 
} 

và Anh đã đánh rơi những điều sau đây:

[DataContract] 
public enum MyEnum{ [EnumMember] red, [EnumMember] green, [EnumMember] blue }; 

Tôi đoán kể từ khi enum được tham chiếu qua ServiceKnownType, nó không cần phải được đánh dấu trong thư viện bên ngoài với [DataContract] hoặc [Enumerator ]

+0

Làm việc tốt cho tôi. Cảm ơn! – Contango

+0

Làm việc rất tốt cho tôi. Cảm ơn! – ari

32

Tôi gặp vấn đề khá lạ và nghĩ rằng điều đó có thể thú vị với bạn. Tôi cũng gặp vấn đề khi dừng kết nối khi sử dụng enums trong hợp đồng dữ liệu của mình. Tôi đã mất khá nhiều thời gian để tìm ra vấn đề thực sự là: Tôi đã sử dụng enums với các giá trị int được gán. Họ bắt đầu bằng 1 thay vì 0. Rõ ràng WCF yêu cầu rằng có một giá trị enum bằng 0 cho serialization.Nếu bạn không khai báo bất kỳ giá trị nào trong liệt kê của bạn, ánh xạ giá trị int tự động sẽ được thực hiện cho bạn bắt đầu bằng 0, vì vậy mọi thứ đều ổn. Nhưng khi bạn sao chép dán một số định nghĩa enum khác mà giá trị 0 không được chỉ định, bạn sẽ không nhận được điều đó cho khách hàng của bạn thông qua WCF - lạ nhưng đúng!

+8

Tôi ước tôi có thể bình chọn câu trả lời của bạn một tỷ lần. Tôi chỉ mất hai giờ để giải quyết một hợp đồng dữ liệu để xem tài sản nào gây ra vấn đề. Ya biết đội WCF đôi khi Enums được ánh xạ tới các bảng tra cứu trong cơ sở dữ liệu, nơi thường là mục đầu tiên là một và không phải là số không. – MotoWilliams

+0

MotoWilliams về cơ bản đã nói chính xác những gì tôi muốn nói. Tìm thấy câu trả lời này sau khi cố gắng giải quyết vấn đề này trong một thời gian, cho đến khi tôi tìm ra giải pháp này. Làm việc hoàn hảo cho tôi. – petstran

+0

Tôi cũng đã gặp phải lỗi này, rất khó để gỡ lỗi. Nó được đề cập trong các tài liệu MSDN rằng enums giá trị bằng không sẽ không được tuần tự hóa (hoặc chính xác hơn, các giá trị enum không có ánh xạ). https://msdn.microsoft.com/en-us/library/aa347875%28v=vs.110%29.aspx –

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