Question

Supposons que ce scénario simple: Mon client a une application .net travaille déjà et il / elle veut exposer certaines fonctionnalités par WCF. Alors, il me donne un ensemble, containg une classe publique qui expose la méthode followig.

OrderDetail GetOrderDetail (int orderId) // Suppose OrderDetail has {ProductId, Quantity, Amount)

Maintenant, je veux certains membres de OrderDetail (montant) ne doit pas être publié en feuilleton. Selon http://msdn.microsoft.com/en-us/library/aa738737 .aspx , la façon de le faire est au moyen du [DataContract] et [DataMember] / [IgnoreDataMember] attributs. Cependant, ce n'est pas une option pour moi parce que je ne peux pas modifier le code source du client. Donc, je suis à la recherche d'un moyen de spécifier les membres que je veux sérialisation dehors, en dehors de la définition du type. Quelque chose qui devrait ressembler à ceci:

    [OperationContract]
    [IgnoreMember(typeof(OrderDetail), "Amount" )]
    OrderDetail QueryOrder(int orderId){
          return OrderDetail.GetOrderDetail(orderId)  
    }

Y at-il moyen de ce? Merci, Bernabé

Était-ce utile?

La solution

Ne pas envoyer les clients des objets à travers le fil, créez un DTO des clients objet contenant uniquement les informations que vous souhaitez envoyer et envoyer ce lieu.

Cela vous permet de contrôler exactement ce que l'information est envoyée, et est conforme aux intentions de WCF de faire passer des messages et non des objets

créer un OrderDetailDto class et remplir ce avec les données de la OrderDetail retournée par l'appel à la méthode dans le code des clients. Décorez Le OrderDetailDto avec les attributs de DataContract et DataMember (vous pouvez renommer la classe ici de sorte que quand il est retourné par WCF, il est retourné avec le nom OrderDetail)

Répétez cette opération pour tous les objets du code client, de sorte que, à la limite de service que vous convertissez essentiellement de DTO-> objets client et client Objets-> DTO

EDIT

Alors qu'il pourrait y avoir une option qui permet ce que vous avez demandé (je ne suis pas au courant d'un, mais nous espérons que quelqu'un d'autre pourrait être) considérer que lorsque vous envoyez utiliser vos objets client que DTO vous les utilisez pour deux raisons ( l'objet client et le contrat de message), ce qui est contraire à la responsabilité unique Principe et quand vous les obtenez sur le côté client, ils ne seront pas les mêmes objets côté client, juste DTO avec les mêmes propriétés, vous ne serez pas en mesure d'obtenir un comportement dans les objets côté client (du moins pas sans partage de bibliothèques sur le côté serveur et côté client).

En liant le contrat de données aux objets que vous finissent aussi avoir à gérer les modifications apportées aux objets clients et des contrats de données comme une chose. Quand ils sont séparés, vous pouvez gérer les modifications apportées aux objets côté client sans changer neccessarily les DTO, vous pouvez simplement alimenter la différemment.

Bien qu'il semble que c'est beaucoup de travail pour créer la DTO, à la fin, je pense que ce sera la peine.

Autres conseils

Vous devez écrire une classe wrapper qui expose uniquement les propriétés désirées et appelle simplement la classe de votre client a fourni à obtient ses valeurs.

La seule autre option serait d'émettre une nouvelle classe dynamique utilisant la réflexion et serialize que (voir http://msdn.microsoft.com/en-us/library/system.reflection.emit.typebuilder.aspx ), mais son effort probablement pas la peine à moins que vous avez besoin de construire un grand nombre de classes d'emballage.

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