2010-06-09 4 views
3

Je me demandais s'il était préférable dans WCF d'utiliser plusieurs contrats d'opération ou d'avoir un seul contrat d'opération avec un contrat de données polymorphes.Dans WCF, vaut-il mieux avoir plusieurs contrats d'opération ou avoir une seule opération avec contrat de données polymorphes?

Permettez-moi de vous donner un petit exemple:

[OperationContract] 
action1Answer action1(action1data a); 

[OperationContract] 
action2Answer action2(action2data a); 

ou

[OperationContract] 
actionAnswer action(actionContract a); 

contrat d'action serait une classe abstraite qui à la fois action1Contract et action2Contract vont hériter de. Le contrat d'action spécifierait la fonction membre do() dans son interface qui serait à son tour surchargée dans les classes enfant

Personnellement, je trouve la seconde approche plus intéressante car elle permet de bien encapsuler les données et l'action dans le contrat d'action dérivé et facilite l'ajout de nouvelles actions. Mais c'est la première fois que j'utilise la WCF alors vous savez probablement mieux!

Répondre

3

Cette frontière question sur les bords des guerres saintes de polymorphisme OO et SOA, mais je vais donner mes deux cents:

Lorsque vous envisagez de développer une couche de service, il devrait être clair à la fin consommateur du service, ce qu'il faut passer et à quoi s'attendre; approche 2 ne gère pas très bien. (De plus, lorsque vous effectuez SOAP avec WCF et que vous chargez à partir de wsdl dans d'autres projets .NET, il ne marque pas correctement les classes abstraites et les interfaces ne sont pas transférées.Les WSDL n'ont aucun moyen de décrire une classe de base non instanciable. Bien que, je dois admettre, je pense que le deuxième processus est grand en utilisant le KnownTypeAttributes (comme je le vois juste maintenant marc_s a posté) - Je l'ai utilisé moi-même en tenant compte des besoins futurs inconnus.

+0

Merci pour la réponse très informative! Je n'ai jamais réalisé OO et SOA pourraient être en contradiction comme ceci. Même si je préfère la deuxième approche (venant d'un arrière-plan OO), je pourrais aller avec le premier, pour le bien de la description du service. –

+2

Je suis en train de lire «Microsoft .NET: architecturer des applications pour l'entreprise», qui traite de la SOA de manière satisfaisante, mais il se réfère à «Patterns of Enterprise Application Architecture» de Martin Fowler; Les deux devraient être une bonne lecture si vous êtes intéressé. –

+0

Merci pour les heads up –

2

Je suis d'accord que l'approche # 2 a l'air mieux - du point de vue de la POO. Mais: SOA/WCF et le polymorphisme ne correspondent généralement pas trop - SOA (au moins lors d'appels SOAP) a besoin de classes concrètes qui peuvent être exprimées dans le WSDL/XSD qui définit votre service.

Vous peut utilisation dérivée des types de données à partir d'un type de base commune - si vous le faites, vous devrez regarder dans l'attribut KnownType (ou ServiceKnownType) pour signaler à WCF que vous pourriez retournerez autre chose que l'opération contrat dit effectivement qu'il le fera.

Questions connexes