web-dev-qa-db-fra.com

Partage d'énumération avec le service WCF

J'ai quelques applications différentes parmi lesquelles j'aimerais partager une énumération C #. Je n'arrive pas à comprendre comment partager une déclaration d'énumération entre une application régulière et un service WCF.

Voici la situation. J'ai 2 applications de destop C # légères et un webservice WCF qui ont tous besoin de partager les valeurs d'énumération.

Le client 1 a

 Method1( MyEnum e, string sUserId );

Le client 2 a

Method2( MyEnum e, string sUserId );

Webservice a

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

Mon initiale était cependant de créer une bibliothèque appelée Common.dll pour encapsuler l'énumération, puis de simplement référencer cette bibliothèque dans tous les projets où l'énumération est nécessaire. Cependant, WCF rend les choses difficiles car vous devez baliser l'énumération pour qu'elle fasse partie intégrante du service. Comme ça:

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

Alors ... Existe-t-il un moyen de partager une énumération entre un service WCF et d'autres applications?

49
Keith G

L'utilisation de la bibliothèque commune devrait convenir. Les énumérations sont sérialisables et les attributs DataContract ne sont pas nécessaires.

Voir: http://msdn.Microsoft.com/en-us/library/ms731923.aspx

Types d'énumération. Les énumérations, y compris les énumérations d'indicateurs, sont sérialisables. Facultativement, les types d'énumération peuvent être marqués avec l'attribut DataContractAttribute, auquel cas chaque membre qui participe à la sérialisation doit être marqué avec l'attribut EnumMemberAttribute

EDIT: Même ainsi, il ne devrait y avoir aucun problème à ce que l'énumération soit marquée comme DataContract et à ce que les bibliothèques clientes l'utilisent.

46
Szymon Rozga

J'ai dû avoir des problèmes avec une référence de service obsolète ou quelque chose. Je suis retourné et j'ai créé une bibliothèque commune contenant l'énumération, et tout fonctionne bien. J'ai simplement ajouté une référence d'utilisation au fichier de l'interface de service.

using Common;  

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

et j'ai laissé tomber ce qui suit:

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

Je suppose que puisque l'énumération est référencée via ServiceKnownType, elle n'avait pas besoin d'être balisée dans la bibliothèque externe avec [DataContract] ou [Enumerator]

34
Keith G

J'ai eu un problème assez étrange et j'ai pensé que cela pourrait vous intéresser. J'ai également eu des problèmes avec l'arrêt de la connexion lorsque j'ai utilisé des énumérations dans mon contrat de données. Il m'a fallu un certain temps pour découvrir quel était le vrai problème: j'ai utilisé des énumérations avec des valeurs int attribuées. Ils ont commencé par 1 au lieu de 0. De toute évidence, WCF requiert une valeur d'énumération égale à 0 pour la sérialisation. Si vous n'indiquez aucune valeur dans votre énumération, un mappage automatique des valeurs int sera effectué pour vous en commençant par 0, donc tout va bien. Mais lorsque vous copiez collez une autre définition d'énumération où la valeur 0 n'est pas attribuée, vous n'obtiendrez pas cela à votre client via WCF - étrange mais vrai!

32
Pilsator

vous pouvez attribuer des valeurs int à vos membres Enum et simplement utiliser des int pour le transfert et, si nécessaire, les reconvertir dans votre type Enum

0