comment marquer un interface comme DataContract dans WCF
j'ai deux classes de données qui ne détiennent que des données membres(pas de fonction). On est CallTask l'autre est SmsTask. Ces deux catégories ont en commun certaines propriétés comme la ID, Tél. J'ai mis ces propriétés en commun dans une salle de classe d'interface et j'utilise cette interface de la classe dans mon projet, le cas échéant.
Maintenant, j'ai ajouté un WCFService à mon projet pour partager des données entre les clients et le serveur. Considérons la classe suivante de conception:
public interface IGsmTask : IComparable
{
string TaskID { get; set; }
string SessionID { get; set; }
string Tel { get; set; }
}
class CallTask : IGsmTask
{
#region IGsmTask Members
public string TaskID { get; set; }
public string SessionID { get; set; }
public string Tel { get; set; }
#endregion
}
class SmsTask : IGsmTask
{
#region IGsmTask Members
public string TaskID { get; set; }
public string SessionID { get; set; }
public string Tel { get; set; }
#endregion
public string SmsText { get; set; }
}
dans cette conception, je veux hôte CallTask, SmsTask, et IGsmTask aux clients de les utiliser dans le service de methots comme suit;
[OperationContract]
public void AddTask(IGsmTask task)
{
}
j'ai essayé de marquer [DataContract] sur IGsmTask, mais il me donne complition erreur. N'est-il methot que je peux utiliser des interfaces comme DataContracts? Ou comment dois-je utiliser KnownAttributes types dans ce synerio?
Merci.
Grâce Reniuz il semble que je ne peux pas utiliser les interfaces pour ce but.
WCF est une message système - le client envoie un XML sérialisé message au serveur. En tant que tels, ces messages doivent être type peut être sérialisé en XML et représentée par un schéma XML. Les Interfaces ne peuvent pas être sérialisé en XML ....
Eh bien la première chose que je voudrais faire est de créer une classe pour stocker des propriétés communes, pas d'interface. De cette façon, vous économisez au moins 3 lignes dans chaque classe dérivée.
OriginalL'auteur Fer | 2012-04-02
Vous devez vous connecter pour publier un commentaire.
Autant que je sache, à l'aide d'interfaces comme datacontracts n'est pas possible. Vous pouvez utiliser une classe de base et ajouter knowntype attributs sur l'inverse.
Depuis la sérialisation est basé sur des instances de l'objet, je pense qu'il n'y a pas de moyen direct de le faire.
OriginalL'auteur daryal
Fer: Tout est Possible avec de la bonne conception.
Si la question est:
une classe est un contrat de données
&&
1 ou plusieurs de ses propriétés doit être une interface...
Le problème est que lorsque la dé-sérialisation se produit --
Il n'y a aucun moyen de transformer les données dans une classe qui implémente ICustomInterface.
La Solution consiste à créer une classe qui implémente l'interface, et à lancer les getter/setter de la propriété publique (qui est de type interface) dans une propriété de la classe concrète.
OriginalL'auteur Zack Weiner