使用Unity注册WCF代理包装器

时间:2014-11-25 08:38:09

标签: wcf asp.net-mvc-4 dependency-injection proxy unity-container

我正在尝试在我的MVC网络应用中使用WCF。我已经实现了通道工厂来实例化代理客户端。 我陷入了困境。这是代码亮点 -

我创建了一个代理基类,我正在创建频道:

public abstract class ServiceProxyBase<T> : IDisposable where T : class

为了创建代理包装器类,我将此基类继承为:

public class ProxyWrapper : ServiceProxyBase<IMyService>,IMyService 

这里“IMyService”是WCf合约。

现在,在控制器中我添加了重载的构造函数:

public class AccountController : Controller
{
    private IMyService businessService;

    public AccountController(IMyService _businessService)
    {
       this.businessService = _businessService;
    }
}

对于注入依赖,我已经包含了unity.mvc4包。

当我使用以下代码时,它工作正常:

container.RegisterType<IMyService, ProxyWrapper>();

只要ProxyWrapper直接继承IMyService接口,这就有效。如果我删除继承像

public class ProxyWrapper : ServiceProxyBase<IMyService>

注册类型时出错。 我希望有一种方法可以不在代理包装器中包含合同。我花了差不多一天试图解决这个问题。但我能够找到解决方案。

请就此提出宝贵意见。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您的应用程序正在使用WCF服务,但与服务提供的功能相比,您的应用程序所需的功能有限(它包含的方法比您需要的多)。根据{{​​3}},&#34;不应该强迫客户端依赖它不使用的方法&#34;和Interface Segregation Principle表示客户拥有抽象。

换句话说,您应该定义应用程序应该使用的自己的接口,并定义一个包装(即Dependency Inversion Principle)生成的WCF代理类的实现。

例如:

public interface IMyApplicationService
{
    object GetStuff();
    void PutStuff(object instance);
}

public class MyServiceApplicationProxy : IMyApplicationService
{
    private readonly ProxyWrapper wcfProxy;

    public MyServiceApplicationProxy(ProxyWrapper wcfProxy) {
        this.wcfProxy = wcfProxy;
    }

    public object GetStuff() {
        return this.wcfProxy.GetStuff();
    }

    public void PutStuff(object instance) {
        this.wcfProxy.PutStuff(instance);
    }
}

为了简化应用程序开发,使您的代码更易于阅读,维护和测试。

您甚至可能希望更改界面的方法以更好地满足您的应用程序需求。记住:客户端定义了界面!这可能意味着您需要在MyServiceApplicationProxy类中进行更多映射,以使您的核心域适应外部Web服务的合同。不要让外部WCF服务合同泄漏到您的核心域。