2009-12-20 5 views
1

Je viens de lire a fantastic article sur les transactions et le flux WCF. Quasiment ne m'a laissé une question sans réponse:Comment appliquer des contrats de flux de transactions WCF avec deux services dans le même projet?

J'ai un seul projet avec deux méthodes de service définies:

ServiceA.svc 

    [OperationBehavior(TransactionScopeRequired = true)] 
    OperationA() 


ServiceB.svc 

    [OperationBehavior(TransactionScopeRequired = true)] 
    OperationB() 

OperationA() a besoin d'appeler OperationB().

Je pourrais facilement dire simplement new ServiceB().OperationB(...) à l'intérieur ServiceA (rappelez-vous je l'ai dit qu'ils sont dans le même projet Web en cours d'exécution sur le même serveur.

Au début, je pensais que c'est ce que je ferais, mais je suis Je ne sais pas si toutes les transactions seront foirées ou pas - surtout si les contrats de transaction diffèrent entre les deux opérations.Evidemment, si j'accède à Transaction.Current de OperationB alors il existera, mais si les deux opérations avaient des contrats différents (comme décrit dans l'article référencé) les règles ne seraient pas suivies

Quel est le bon w ay ServiceA.OperationA() pour appeler ServiceB.OperationB()?

(Curieux aussi comment faire quand une opération appelle un autre dans la même classe, mais c'est probablement une chose plus facile à Google pour)

Répondre

1

L'hypothèse de base avec WCF est que vous toujours appel une méthode de service via un proxy client. Ce comportement permet au runtime WCF d'entrer dans la pile d'appels et de faire toute sa magie. Par conséquent, dans votre cas, si vous souhaitez appeler ServiceB à partir de ServiceA, vous devez créer un proxy client pour ServiceB à l'intérieur de ServiceA et appeler le ServiceBClientProxy.OperationB() sur ce proxy client.

Vous pouvez créer un proxy client de plusieurs façons:

  • par Visual dialogue Studio « Ajouter un service de référence », qui sous les couvertures appelle simplement essentiellement l'utilitaire de ligne de commande svcutil.exe, que vous pouvez également appeler directement. Cela crée de bons proxies et tout, mais d'horribles configs

  • puisque ces deux services sont dans le même projet, les deux auront accès aux contrats des uns et des autres, n'est-ce pas? Dans ce cas, vous pouvez créer manuellement un proxy client dans quelques lignes de code.

Fondamentalement, ce que vous avez besoin est une ChannelFactory<T> instance pour le contrat de service de votre Serviceb, puis vous appelez la méthode CreateChannel() sur cette usine de canal pour obtenir le canal réel (= le proxy client) pour ce service. Quelque chose comme ceci:

ChannelFactory<IServiceB> factory = new ChannelFactory<IServiceB>(); 
IServiceB clientProxy = factory.CreateChannel(); 

Cela prend tous les détails de la web.config - si vous voulez, vous pouvez définir les liaisons et points de terminaison dans le code et les passer dans le constructeur de la ChannelFactory.

Vous avez maintenant un proxy client pour ServiceB et vous pouvez appeler toutes ses méthodes. C'est la bonne façon de le faire dans la WCF.

Espérons que cela aide un peu!

+0

c'est ce que je cherchais merci. J'ai un livre WCF sur mon Kindle mais sa peine de trouver des trucs comme ça. ps. Je suis en hausse de 30% par rapport à la dernière fois que vous l'avez mentionné :-) –

Questions connexes