2008-10-09 15 views
47

Mam kilka różnych aplikacji, wśród których chciałbym współdzielić wyliczenie C#. Nie wiem, jak podzielić deklarację enum między zwykłą aplikacją a usługą WCF.Udostępnianie Enum z usługą WCF

Oto sytuacja. Mam 2 lekkie aplikacje C# destop i usługę WCF, które wszystkie muszą udostępniać wartości wyliczeniowe.

Client 1 ma

Method1(MyEnum e, string sUserId); 

Klient 2 posiada

Method2(MyEnum e, string sUserId); 

WebService

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

moim początkowym chociaż było stworzenie biblioteki o nazwie Common.dll do hermetyzacji i enum następnie odwołaj się do tej biblioteki we wszystkich projektach, w których potrzebne jest wyliczenie. Jednak WCF sprawia, że ​​rzeczy trudne, ponieważ trzeba znaczników wyliczenia, aby być integralną częścią usługi. W ten sposób:

[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 }; 

Więc .... Czy istnieje sposób na dzielenie się wyliczeniem między usługą WCF a innymi aplikacjami?

+0

Zaleca się unikanie wyliczeń w serwisach WWW, ponieważ tworzą one subtelne problemy kompatybilne wstecz. Zobacz http://stackoverflow.com/a/788281/52277 –

+1

Nie dotyczy w tym przypadku; wymienione problemy ze zgodnością z poprzednimi wersjami są spowodowane * zwróceniem * wyliczenia do klienta (co bardzo wyraźnie może je złamać) w porównaniu z wyliczeniem jako danych wejściowych. –

Odpowiedz

45

Korzystanie z biblioteki wspólnej powinno być w porządku. Wyliczenia można szeregować, a atrybuty DataContract nie są potrzebne.

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

rodzajów Enumeration. Wyliczenia, w tym wyliczenia flag, są przekształcane do postaci szeregowej. Opcjonalnie, typy wyliczeniowe może być oznaczony atrybutem DataContractAttribute, w takim przypadku każdy członek, który uczestniczy w serializacji muszą być oznaczone EnumMemberAttribute przypisują

EDIT: Nawet tak nie powinno być żadnego problemu z posiadające wylicza się jako DataContract i posiada biblioteki klienckie, które go używają.

+4

Zaleca się unikanie wyliczeń w serwisach WWW, ponieważ tworzą one subtelne problemy kompatybilne wstecz. Zobacz http://stackoverflow.com/a/788281/52277 –

0

można przypisać wartości int do swoich członków Enum i po prostu użyć int przesunięcia w razie potrzeby rzucać je z powrotem do swojego typu Enum

+4

Pokonuje cel wyliczenia. – Gaui

33

muszę mieć jakieś problemy z przestarzałym odniesienia serwisu lub czegoś. Wróciłem i stworzyłem wspólną bibliotekę zawierającą enum i wszystko działa dobrze. Po prostu dodałem odwołanie do pliku interfejsu usługi.

using Common; 

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

i rzuciłem następujące:

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

Chyba od enum jest określany poprzez ServiceKnownType, nie muszą być oznakowane w bibliotece zewnętrznego z [DataContract] lub [Enumerator ]

+0

Dobrze mi działało. Dzięki! – Contango

+0

Sprawdziło się również dla mnie. Dzięki! – ari

32

Miałem dość dziwny problem i pomyślałem, że może być dla ciebie interesujący. Miałem również problemy z tym, że dostałem punkt połączenia, gdy użyłem enum w mojej umowie z danymi. Zajęło mi trochę czasu, aby dowiedzieć się, co jest prawdziwym problemem: użyłem wyrażeń z przypisanymi wartościami int. Zaczęli od 1 zamiast 0. Oczywiście WCF wymaga, aby wartość wyliczeniowa była równa 0 dla serializacji.Jeśli nie określisz żadnych wartości w swoim wyliczeniu, automatyczne odwzorowanie wartości int zostanie wykonane dla ciebie począwszy od 0, więc wszystko jest w porządku. Ale kiedy skopiujesz wklej inną definicję wyliczenia, gdy wartość 0 nie zostanie przypisana, nie dostaniesz jej do klienta za pośrednictwem WCF - dziwne, ale prawdziwe!

+8

Chciałbym móc głosować na twoją odpowiedź miliard razy. Po prostu spędzam dwie godziny na rozwinięciu umowy dotyczącej danych, aby sprawdzić, która właściwość powoduje problem. Czasem wiesz, że zespół WCF czasami Konta są mapowane na tabele odnośników w bazie danych, gdzie zwykle pierwszy wpis to jeden, a nie zero. – MotoWilliams

+0

MotoWilliams zasadniczo powiedział dokładnie to, co chciałem powiedzieć. Znaleziono tę odpowiedź po próbie rozwiązania tego problemu przez jakiś czas, aż znalazłem to rozwiązanie. Idealne dla mnie. – petstran

+0

Ja też spotkałem się z tym subtelnym błędem, trudno go debugować. W dokumentach MSDN wspomniano, że wyliczenia o wartości zerowej nie będą serializowane (lub dokładniej, wartości wyliczeniowe bez mapowania). https://msdn.microsoft.com/en-us/library/aa347875%28v=vs.110%29.aspx –

Powiązane problemy