mardi 17 juillet 2012

Client WCF à partir de l'interface .NET - le ChannelFactory

Souvent, pour réaliser un client sur un service WCF, on passe par une "Service Reference". Ce type de référence, va générer du code(Visual Studio) et notamment un client qui implémente une interface compatible avec l'interface du service. Après génération de ce code, si vous regarder votre code, vous trouverez d'une part l'interface au niveau de votre service et d'autre part l'interface générée gentiment par Visual Studio. Les datacontracts utilisés par votre service seront également dupliqués du coté du client.

L'avantage de cette solution est sa facilité de mise en place et l'indépendance du client par rapport au service. Le désavantage est cette duplication du code. Si vous êtes détenteur du code du service et donc de ses contrats, pourquoi ne pas directement utiliser ces contrats au lieu d'en régénérer dans votre assembly cliente ? Pour éviter cette duplication, il est possible de créer un client wcf à partir du contrat via la classe System.ServiceModel.ChannelFactory. Comment utiliser ce ChannelFactory ?

Pour voir le fonctionnement, nous allons faire une petite solution visual studio qui comprendra:
  • Un assembly avec l'interface du service(Contracts)
  • Un assembly avec l'implémentation du service(Services) - reférence Contracts
  • Un host pour le service (SVCHost) - référence Services et Contracts
  • Une console qui sera client du service (ConsoleClient) - référence Contracts
N'oubliez pas d'ajouter les références vers System.ServiceModel et System.Runtime.Serialization sur vos projets. Vous devriez alors avoir quelque chose comme :
Voici le code des différents composants :

Le code du host (hello.svc)
 Le code du client
Comme nous pouvons le voir ici, il n'y a pas de code généré. Le client référence simplement l'assembly contenant les interfaces et WCF va nous généré un client au travers de la classe ChannelFactory.

Le gros avantage est que si vous modifier votre interface, vous pouvez directement voir les impacts. Cette solution ne fonctionne néanmoins que dans un système fermé (entièrement sous contrôle d'une seule entité). Si vos services sont ouverts, vous ne pouvez pas fournir forcément fournir votre assembly de contrats. Dans ce cas la, une service reference s'impose !

Sources :

Aucun commentaire:

Enregistrer un commentaire