Vous êtes sur la bonne voie, je dirais ;-)
Fondamentalement, la création du proxy client WCF est un processus en deux étapes:
- créer l'usine de canal
- de l'usine de canal, créer le canal réel
Étape # 1 est assez "cher" en termes de temps et d'efforts nécessaires - donc c'est certainement une bonne idée de le faire une fois et ensuite mettre en cache l'instance de ProjectWcfServiceFactory
quelque part dans votre code.
L'étape 2 est en fait assez légère, et puisqu'un canal entre un client et un service peut tomber dans un "état défaillant" lorsqu'une exception se produit sur le serveur (et doit ensuite être recréée à partir de zéro), la mise en cache du canal proprement dit est moins souhaitable.
Donc, la meilleure pratique communément admise serait:
créer le ChannelFactory<T>
(dans votre cas: ProjectWcfServiceFactory
) une fois et le cache aussi longtemps que possible; faire cette lourde charge une seule fois
créer le Channel
réel (ici: IProjectWcfService
) au besoin, avant chaque appel. De cette façon, vous n'avez pas à vous soucier de vérifier son état et de recréer au besoin
MISE À JOUR: « ? Qu'en est-fermeture du canal » demande Burt ;-) Bon point !!
La meilleure pratique acceptée pour cela est d'encapsuler votre appel de service dans un bloc try....catch....finally
. La partie délicate est la suivante: lors de la mise au rebut du canal, les choses peuvent mal se passer aussi, donc vous pourriez avoir une exception - c'est pourquoi l'envelopper dans un bloc using(....)
n'est pas suffisant.
Donc, fondamentalement, vous avez:
IProjectWcfService client = ChannelFactory.CreateChannel();
try
{
client.MakeYourCall();
}
catch(CommunicationException ce)
{
// do any exception handling of your own
}
finally
{
ICommunicationObject comObj = ((ICommunicationObject)client);
if(comObj.State == CommunicationState.Faulted)
{
comObj.Abort();
}
else
{
comObj.Close();
}
}
Et bien sûr, vous pourriez certainement envelopper bien cela dans une méthode ou une méthode d'extension ou de quelque chose afin de ne pas taper ce à chaque fois que vous faites un service appel.
MISE À JOUR:
Le livre que je recommande toujours de se lever et courir dans WCF est rapidement Learning WCF par Michele Leroux Bustamante. Elle couvre tous les sujets nécessaires, et d'une manière très compréhensible et accessible. Cela vous apprendra tout - les bases, les sujets intermédiaires, la sécurité, le contrôle des transactions et ainsi de suite - que vous devez savoir pour écrire des services WCF utiles et de haute qualité.
Learning WCF http://ecx.images-amazon.com/images/I/41wYa%2BNiPML._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg
Les sujets plus avancés et plus en profondeur au regard WCF sera couvert par Programming WCF Services par Juval Lowy. Il plonge vraiment dans tous les détails techniques et sujets et présente «la bible» pour la programmation de WCF.
Programming WCF Services http://ecx.images-amazon.com/images/I/41H2u13a9bL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg
Qu'en est-fermeture du canal? – Burt
Merci, cela a éclairci un peu les choses, j'ai vraiment besoin d'acheter un livre WCF (toutes les recommandations seraient les bienvenues). – Burt
Pourquoi la capture est-elle en train de faire essentiellement la même chose, c'est-à-dire comObj.Abort? Y a-t-il un besoin d'avorter dans la prise? – Burt