J'ai un service wcf qui expose un assez grand nombre de méthodes de service sur une seule adresse de point de terminaison. Jusqu'à présent, toutes les méthodes de service sont implémentées dans une seule classe de contrat de service. Cette classe de contrat de service implémente plusieurs interfaces de contrat de service. Maintenant, je voudrais diviser la mise en œuvre des méthodes de contrat de service en plusieurs classes afin d'éviter que la classe de contrat de grandir. J'utilise un scénario d'auto-hébergement avec un ServiceHost. Le ServiceHost prend simplement le type d'un seul type implémentant les méthodes de service, il semble donc que tout doit être implémenté dans cette classe. Bien sûr, la chair des méthodes peut être factorisée en plusieurs classes. Mais y a-t-il aussi un moyen de diviser les méthodes en plusieurs classes?WCF Large interface à une seule adresse de point de terminaison
Répondre
Vous pouvez implémenter le service en tant que partial class, ce qui vous permet de diviser l'implémentation en plusieurs fichiers.
Si l'exigence est de conserver un seul point de terminaison et une seule interface, il n'y a pas d'autre moyen de le séparer - la classe que vous créez doit implémenter toute l'interface.
Je suggère de garder l'implémentation de service aussi simple que possible, et de faire en sorte que chaque méthode soit un interligne qui délègue l'opération à l'implémentation réelle, qui peut ensuite être répartie sur plusieurs classes. Peut-être cela aurait-il même un sens d'en faire un par opération? C'est un modèle que j'ai utilisé auparavant avec succès.
Vous pouvez créer autant de contrats de service que vous le souhaitez, chacun avec sa propre logique. L'aspect positif de cette approche est, comme vous le souhaitez, de regrouper logiquement les fonctions connexes. L'inconvénient est que le client appelant doit maintenant savoir quel service utiliser lors de l'appel de la fonction.
Il est recommandé de limiter le nombre d'opérations dans le service. Comme je comprends votre scénario en ce moment, vous avez une implémentation de service unique qui implémente plusieurs contrats de service. Cela signifie que vous avez déjà plusieurs points de terminaison sur votre service - chaque point d'entrée expose un contrat unique. Dans ce cas, votre client est déjà prêt à créer un proxy distinct pour chaque contrat requis.
Maintenant, vous souhaitez diviser votre classe d'implémentation de service dans plusieurs implémentations de service. Chaque implémentation de service implémentera un (ou un ensemble plus petit) de contrats de service. Cela nécessitera une modification de votre application d'hébergement - vous aurez besoin de ServiceHost distinct pour chaque implémentation de service. Vous aurez également besoin d'une configuration distincte et d'une adresse unique pour chaque implémentation de service.
Côté client peut être juste recréé avec de nouveaux services, mais je pense qu'il devrait également être possible de simplement changer les adresses pour les points de terminaison et cela devrait fonctionner.
Merci pour votre réponse. Je suis en train de planifier et de mettre en place une interface d'échange de données pour un système assez important. Les clients utiliseront très probablement toujours l'intégralité de l'interface et des plates-formes différentes. Dans un tel szenario, je pense qu'il est plus facile pour le client d'avoir une seule adresse de point de terminaison. J'ai créé plusieurs interfaces de contrat de service et laissé une "interface maître" hériter de toutes les interfaces de contrat de service. La classe de contrat servcice implémente ensuite l'interface maître. – WalterOesch
Nous vous remercions de votre réponse. J'ai aussi pensé aux classes partielles, mais à mon avis, les cours partiels n'aident pas à garder une solution simple. Je vais aller comme vous avez suggéré, en utilisant un seul revêtement pour chaque opération – WalterOesch