2010-11-22 181 views
2

我有一个使用另一个服务(Service2)的服务(Service1)。我正在为这两种服务使用依赖注入,并且需要将Service2的代理注入到Service1中。使用WCF代理的依赖注入

我不确定如何处理代理不是简单的IService2类,而是从ClientBase继承的代理。很明显,我的Service1实现需要打开代理,并且应该在使用后关闭它,或者如果发生异常而中止它,但是如果我只是注入一个IService2实例,那么我不能这样做(因为打开,关闭和中止方法)是在基类上,而我的操作是在界面上。

当谈到测试Service1时,我希望只是模拟接口,但如果Service1实现期望Open,Close和Abort方法,那么这很棘手。在过去,我做了一件这样的事,但必须有更好的方法!

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). 

其他人在做什么?

感谢

回答

0

我结束了使用this approach它使用城堡动态代理拦截调用和处理WCF细节。它运行得非常好,并允许代理注入的类将其视为正常的类/接口。然后通过嘲笑服务合约界面来完成这个类的单元测试。

+0

@ the-folower-guy请更新评论中的链接。谢谢 – 2013-10-19 18:37:26

3

自动生成的,你得到了增加对WCF服务的服务参考实现为部分类类。我要做的就是创建该类的另一部分文件和实施暴露这些方法的接口,然后使用该接口,你通常会使用ClientBase或WCF接口

public partial class Service2 : IClientService2 
{} 

如果IClientService2有中止和关闭匹配ClientBase方法的方法应该是您所需要的。

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

我建议注射工厂构建WCF服务,而不是注入代理本身发生故障时,则通道不再能够使用,你将需要建立一个新的代理至今。

IClientService2 proxy = _service2Factory.Create(); 


proxy.Open(); 


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


proxy.Close(); 
+0

我使用相同的解决方案,不同之处在于我的IClientService2接口从ICommunicationObject继承而不是具有中止和关闭方法。 (当然它也从IService2继承)。 – dvdvorle 2011-03-09 14:15:42

3

由于Wcf强加的要求,您的接口受到了干扰。如果你没有使用wcf,你将不会有Open和Close方法。在理想的世界里,界面应该看起来就像服务正在进行一样。

您是否选择了IoC容器?如果你还没有,我会考虑看看Windsor。这将允许您维护一个干净的界面,并将服务作为进程内对象或wcf代理注入。

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

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

WcfFacility将为您打开和关闭所有频道。

+0

有趣。我之前在服务端使用过Windsor WCF项目,但不知道客户端的东西。不幸的是,我必须使用Unity。 – 2010-11-26 09:49:20

+0

我之前使用过Unity的时候是相对较新的,如果类似的东西没有实现,我会感到惊讶。 – Bronumski 2010-11-26 11:22:41