我正在尝试在我的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>
注册类型时出错。 我希望有一种方法可以不在代理包装器中包含合同。我花了差不多一天试图解决这个问题。但我能够找到解决方案。
请就此提出宝贵意见。
答案 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服务合同泄漏到您的核心域。