Question

Je travaille sur une application Windows Phone 7 en utilisant WCF pour les communications avec mon serveur.

J'ai créé un service et je suis capable de bien communiquer, mais je vais avoir du mal à accéder à une interface dans le code client.

Par exemple, dans mon code serveur j'ai quelque chose comme ceci:

[OperationContract]
[ServiceKnownType(typeof(IField))]
[ServiceKnownType(typeof(TextField))]
[ServiceKnownType(typeof(NumberField))]
FieldForm GetForm();

Maintenant, mon FieldForm contient la déclaration suivante:

[DataContract]
class FieldForm
{
   public List<IField> Fields { get; set; }
}

Et enfin, cette interface Ifield a quelques implémentations:

interface IField
{
   string Name { get; set; }
}

[DataContract]
class TextField : IField
{
}

[DataContract]
class NumberField : IField
{
}

(ce n'est pas mon code, mais décrit ce que je suis en train d'accomplir)

Maintenant sur mon client, je reçois un objet FieldForm via WCF et que vous souhaitez parcourir la liste des champs pour déterminer quels sont les éléments pour créer l'interface utilisateur. Le problème est, le service n'a pas fourni l'interface Ifield sur le client, mais j'ai les implémentations disponibles (TextField et NumberField).

Cela conduit à un code merdique dans mon code client comme:

foreach ( object field in Fields )
{
   if ( field is TextField )
      // do textfieldy stuff
   else if (field is NumberField)
      // do numberfieldy stuff
}

quand je préfère vraiment utiliser simplement:

foreach ( IField field in Fields )
{
   field.Name;
}

Suis-je manque une simple annotation sur l'interface afin de rendre le type d'interface disponible sur le client, ou ne WCF tout simplement pas fournir la capacité de sérialisation interfaces?

Est-il possible que je peux accéder à mon interface dans mon code client?

Était-ce utile?

La solution

Non, vous ne pouvez pas sérialiser une interface sur une connexion WCF.

WCF utilise des messages sérialisés (XML) pour communiquer entre le client et le serveur - tout ce que vous pouvez exprimer dans le schéma XML (XSD) peut être déplacé à travers. Cela signifie essentiellement tout type de béton, composé de types atomiques comme int, string, etc .. XSD prend également en charge l'héritage et les énumérations, mais qui est de la fin du mât de drapeau.

Ce que vous pourriez être en mesure de le faire si vous contrôlez les deux extrémités de la liaison de communication (par exemple, le serveur et le client) est de mettre ces interfaces (interfaces de service et vos contrats de données et interfaces) dans un ensemble commun, partagé qui à la fois votre projet client et projet de serveur serait alors référence. Utilisez toute classe implémentant l'interface dans la mise en œuvre du service concret, mais avec ce partage d'assemblage, vous pouvez utiliser la signature que vous aimez sur le côté client et programme contre une interface. Rappelez-vous:. Ce « tue » toute l'interopérabilité de votre service WCF - pas de clients Ruby ou Java pourront appeler votre service plus

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top