WCF代理的依赖注入

WCF代理的依赖注入,wcf,dependency-injection,proxy,mocking,ioc-container,Wcf,Dependency Injection,Proxy,Mocking,Ioc Container,我有一个使用另一个服务(服务2)的服务(服务1)。我正在为这两个服务使用依赖注入,需要将Service2的代理注入Service1 我不确定如何处理这样一个事实:代理不是IService2类型的简单类,而是从ClientBase继承的代理。显然,我的Service1实现需要打开代理,并且应该在使用后关闭代理,或者在发生异常时中止代理。但是,如果我只是注入IService2的实例,那么我就不能这样做(不强制转换),因为打开、关闭和中止方法在基类上,而我的操作在接口上 在测试Service1时,我希

我有一个使用另一个服务(服务2)的服务(服务1)。我正在为这两个服务使用依赖注入,需要将Service2的代理注入Service1

我不确定如何处理这样一个事实:代理不是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).
其他人在干什么


感谢

您为WCF服务添加服务引用而获得的自动生成类被实现为部分类。我要做的是为该类创建另一个部分文件,并实现一个公开这些方法的接口,然后在通常使用ClientBase或WCF接口的地方使用该接口

public partial class Service2 : IClientService2  
{}
如果IClientService2具有与ClientBase方法匹配的Abort和Close方法,那么它应该是您所需要的全部

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();

由于Wcf强加的要求,您的接口受到了污染。如果不使用wcf,就不会有打开和关闭方法。在理想情况下,接口应该看起来与服务正在处理的情况相同

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

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

container.Register(Component
  .For<IClientService2>()
  .ActAs(DefaultClientModel)
  .On(WcfEndpoint.FromConfiguration("YourServiceNameInConfiguration")))
  .LifeStyle.Transient);
container=new WindsorContainer().AddFacility();
容器寄存器(组件
.对于()
.ActAs(DefaultClientModel)
.On(WcfEndpoint.FromConfiguration(“YourServiceNameInConfiguration”))
(生活方式,短暂),;

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

我最终使用了使用Castle Dynamic Proxy拦截呼叫和处理WCF细节的。它工作得非常好,允许注入代理的类将其视为普通的类/接口。然后,通过模拟服务契约接口,该类完全可以进行单元测试。

。我以前在服务端使用过温莎WCF项目,但不知道客户端的东西。不幸的是,我必须使用Unity。我以前使用过Unity,当时它还比较新,如果没有实现类似的功能,我会感到惊讶。我使用相同的解决方案,只是我的IClientService2接口继承自ICommunicationObject,而不是使用Abort&Close方法。(当然,它也继承了IService2)。