2010-11-22 6 views
2

J'ai un service (Service1) qui utilise un autre serice (Service2). J'utilise l'injection de dépendance pour les deux services et j'ai besoin d'injecter le proxy pour Service2 dans Service1. Je ne sais pas comment gérer le fait que le proxy n'est pas une simple classe de type IService2 mais un proxy héritant de ClientBase. Il est évident que mon implémentation Service1 doit ouvrir le proxy et le fermer après utilisation ou l'abandonner si une exception survient mais si je ne fais qu'injecter une instance de IService2, je ne peux pas le faire (sans cast) car les méthodes Open, Close et Abort sont sur la classe de base alors que mes opérations sont sur l'interface. Quand il s'agit de tester Service1, je m'attendrais à se moquer de l'interface mais si l'implémentation de Service1 attend des méthodes Open, Close et Abort, alors c'est compliqué. Dans le passé, j'ai fait quelque chose de hacky comme ça mais il doit y avoir un meilleur moyen!Injection de dépendances avec proxy WCF

var proxyBase = _service2 as ClientBase; 

if (proxyBase != null) 
{ 
    proxyBase.Open(); 
} 

_service2.DoOperation("blah"); //the actual operation 

if (proxyBase != null) 
{ 
    proxyBase.Close(); 
} 

// repeat for Abort in exception handler(s). 

Que font les autres personnes?

Merci

Répondre

0

J'ai fini par utiliser this approach qui utilise Castle Dynamic Proxy pour intercepter les appels et gérer les spécificités WCF. Cela fonctionne très bien et permet à la classe où le proxy est injecté de le traiter comme une classe/interface normale. Cette classe est alors totalement testable à l'unité en se moquant de l'interface du contrat de service.

+0

@ the-folower-guy Veuillez mettre à jour le lien dans votre commentaire. Merci –

3

La classe généré automatiquement que vous obtenez pour ajouter une référence de service pour un service WCF est mis en œuvre en tant que classe partielle. Ce que je fais est de créer un autre fichier partiel pour cette classe et mettre en œuvre une interface qui a exposé ces méthodes, et ensuite utiliser cette interface où vous utilisez normalement l'interface ClientBase ou WCF

public partial class Service2 : IClientService2 
{} 

Si IClientService2 a Abandonner et Fermer Les méthodes qui correspondent aux méthodes ClientBase devraient être tout ce dont vous avez besoin.

public interface IClientService2 : IService2 // where IService2 is the WCF service interface 
{ 
    void Abort(); 
    void Close(); 
} 

Je suggère l'injection d'une usine pour construire des services WCF plutôt que d'injecter le proxy lui-même depuis quand un défaut se produit alors le canal ne peut plus être utilisé et vous aurez besoin de construire un nouveau proxy.

IClientService2 proxy = _service2Factory.Create(); 


proxy.Open(); 


proxy.DoOperation("blah"); //the actual operation 


proxy.Close(); 
+0

J'utilise la même solution, sauf que mon interface IClientService2 hérite de ICommunicationObject au lieu d'avoir les méthodes Abort & Close. (Et il hérite aussi de IService2 bien sûr). – dvdvorle

3

Votre interface est polarisée en raison des exigences imposées par Wcf. Si vous n'utilisiez pas wcf, vous n'auriez pas de méthode Open and Close. Dans un monde idéal, l'interface devrait être la même que si le service était en cours.

Avez-vous choisi votre conteneur IoC? Si vous n'avez pas, je envisagerais de regarder Windsor. Cela vous permettra de maintenir une interface propre et d'injecter le service en tant qu'objet en cours ou en tant que proxy wcf.

container = new WindsorContainer().AddFacility<WcfFacility>(); 

container.Register(Component 
    .For<IClientService2>() 
    .ActAs(DefaultClientModel) 
    .On(WcfEndpoint.FromConfiguration("YourServiceNameInConfiguration"))) 
    .LifeStyle.Transient); 

Le WcfFacility fera tout l'ouverture et la fermeture du canal pour vous.

+0

Intéressant. J'ai déjà utilisé le projet Windsor WCF du côté des services, mais je n'avais aucune idée de ce qui se passait côté client. Malheureusement, je dois utiliser Unity. –

+0

J'ai utilisé Unity avant quand il était relativement nouveau, je serais surpris si quelque chose de similaire n'a pas été implémenté. – Bronumski

Questions connexes