Notre entreprise lance une initiative SOA assez importante. Nous faisons bien des choses: la communication est bonne; de l'argent pour les outils, le cas échéant; et nous avons apporté une bonne expertise pour nous aider dans la transition.
Nous essayons d'élaborer des normes que nous pouvons suivre en tant que groupe, et l'une des normes proposées me dérange beaucoup:
Nous avons standardisé le modèle où chaque opération prend un objet de demande et retourne un objet de réponse.
Je me rends compte que c'est plus ou moins une approche standard pour beaucoup de gens, mais je me demande pourquoi devrais-je m'embêter? (Je ne suis pas si bon avec la sagesse reçue, j'ai besoin d'un peu pourquoi).
La plupart des services que je fournirai sont de simples récupérations de métadonnées organisationnelles. Par exemple, recherchez la stratégie de sécurité pour un utilisateur particulier. Cela nécessite un identifiant utilisateur et rien d'autre. La norme me dit que je devrais encapsuler cette demande dans un objet et encapsuler la politique retournée dans un objet de réponse.
Mon malaise est amplifié par un regard sur le WSDL généré par nos contrats. WCF génère automatiquement des messages de demande et de réponse et encapsule même l'objet de demande / réponse.
Je comprends parfaitement que si vous faites une demande complexe, un objet d'entrée complexe est garanti. C'est ce que vous feriez même si les services n'étaient pas impliqués.
Ma question est pourquoi devrais-je encapsuler automatiquement les demandes et les réponses lorsque:
- Il rend les services simples moins expressifs
- Vous le feriez quand même pour un service complexe
- WCF crée quand même un message de demande / réponse
J'ai trouvé les arguments suivants en faveur de cette approche:
Il prend en charge la gestion des versions en permettant de glisser des paramètres facultatifs dans l'objet de demande.
À l'époque, j'ai fait pas mal de COM, et je considérerais cela presque comme un anti-modèle pour le contrôle de version. Pour certaines choses, je suppose que cela aiderait, mais je m'attends à ce que là où cela aiderait, vous avez déjà un objet paramètre de toute façon.
Il permet d'isoler les données et comportements communs à une classe de base
Celui-ci a du poids avec moi.
Il éloigne les gens d'un comportement de style RPC vers un comportement de messagerie
J'ai lu ceci sur le site de Microsoft et l'ai entendu de notre gourou, mais je n'ai toujours pas une idée claire de ce qu'ils signifient ou pourquoi il est précieux. Est-ce que les interfaces d'apparence naturelle font que les gens ont tendance à oublier qu'ils appellent un service distant?
Je cherche à refactoriser les signatures de peut-être 300 méthodes, donc c'est une quantité non triviale de douleur. Je suis un grand fan de cohérence dans les implémentations, donc je suis prêt à endurer la douleur, cela aidera simplement à savoir que cela en vaudra la peine à la fin.
Les notes de Martin Fowler sur l' objet de transfert de données sont appropriées ici, je pense.
La même chose pourrait s'appliquer aux demandes. Quant à RPC, et pourquoi son mauvais:
Je pense que c'est vrai, mais pas la raison principale. Une autre raison d'éviter le RPC est qu'il peut encourager des clients et des services étroitement couplés.
la source