2009-12-24 14 views
6

J'ai récemment vu un service WCF déclarant des contrats d'opération avec par réf arguments. Je ne sais pas pourquoi cette décision de conception a été prise (les opérations sont nulles), mais de plus, je ne peux pas - à partir de mes connaissances de la WCF - dire si c'est une bonne pratique ou non. Ou si ce n'est pas pertinent.Les arguments 'by ref' dans WCF sont-ils mauvais ou bons?

Qu'en pensez-vous?

Répondre

4

WCF est pas un "appel d'objet à distance" méthode ou quoi que ce soit - c'est pur message-passing. Donc, un paramètre "by-ref" peut compiler, mais il ne va vraiment rien faire d'utile.

Sur votre client, vous disposez d'une méthode avec les paramètres que vous appelez. L'exécution de WCF intercepte alors cet appel, regroupe les paramètres et toutes les informations supplémentaires nécessaires dans un message, sérialise ce message (en XML textuel ou binaire) et envoie ce message à travers le réseau au serveur. Le serveur désérialise ensuite les messages en un ensemble de paramètres, puis le composant répartiteur sur le serveur instancie la classe de service et appelle la méthode appropriée sur cette instance de classe de service avec les paramètres du message.

Toute l'histoire fonctionne en arrière pour la réponse que le serveur renvoie.

Mais encore une fois: tout ce que vous échangez entre le client et le serveur est un message sérialisé - il n'y a absolument inutile de faire un paramètre « par ref » - cela ne peut pas être un paramètre par référence, à la fin. Le serveur et le client sont des mondes totalement séparés, des objets et des classes totalement séparés - ils se ressemblent simplement sur le fil. Je pense donc que quiconque a écrit cette méthode WCF ne comprenait pas les principes du passage de message WCF, mais a été attiré par la façon dont WCF se sent - comme un simple appel de méthode. Mais ce n'est vraiment pas seulement un appel de méthode à la fin.

+4

C'est exactement ce que je pensais. Et après votre réponse, j'ai décidé de faire un test. Semble étrange, mais l'infrastructure WCF gère le par ref: si le service apporte des modifications à l'argument ref, après que l'appel retourne au client, l'argument passé reflète ces changements. – MatteoSp

+0

@MatteoSp: c'est très intéressant à entendre! Je n'ai même pas pris la peine d'essayer, puisque de tout ce que je savais j'étais convaincu que ça ne marcherait jamais - mieux vaut essayer moi-même! :-) Encore poser la question si c'est vraiment une bonne idée, cependant .... –

+3

@marc_s Un peu en retard mais, WCF par défaut est le style RPC. Après tout, nous appelons une méthode sur un objet (proxy) et par magie la méthode fonctionne sur un serveur. Pour utiliser le style 'messagerie', nous devons utiliser des contrats de message qui nous donnent le contrôle total du message SOAP. – thewpfguy

5

Cependant, selon cette article Microsoft un appel WCF se comporte exactement comme un appel de procédure à distance et arguments ByRef peut être utilisé pour renvoyer des données: -

http://msdn.microsoft.com/en-us/library/ms733070.aspx

Référez-vous à la section: Out et paramètres Ref

dans la plupart des cas, vous pouvez utiliser dans les paramètres (ByVal dans Visual Basic) et et sur les paramètres ref (ByRef en Visual Basic). Comme les paramètres ref et ref indiquent que les données sont renvoyées à partir d'une opération, une signature d'opération comme celle-ci spécifie qu'une opération de demande/réponse est requise même si la signature de l'opération renvoie un caractère vide.

1

Je suis avec marc_s.

vous devez faire très attention.

WCF affectera toujours une nouvelle instance de cet objet, il ne changera pas simplement son contenu. Comme expliqué par mars, wcf est un framework de messagerie. Sa nature est d'envoyer et de recevoir des messages indépendants.

Je pense qu'une bonne pratique consiste à toujours définir un message d'entrée et de sortie. Votre interface Sericve sera plus facile à comprendre et à maintenir.

Les méthodes avec les paramètres ref et out ont toujours tendance à être très laids et plus difficiles à comprendre.