【发布时间】:2010-12-08 19:45:33
【问题描述】:
很长一段时间以来,我一直使用适配器模式将我的 WCF 服务客户端从调用代码中抽象出来,这样我就可以有效地对我的业务对象进行单元测试,而不依赖于服务客户端。例如:
public class MyBusinessObject
{
private ITheService _service;
public MyBusinessObject(ITheService service) { _service = service; }
public void DoSomethingOnTheServer() { _service.DoSomething(); }
}
现在适配器的接口和具体实现与服务代理本身公开相同的合同。所以,继续这个例子:
public interface ITheService
{
void DoSomething();
ServerObject GetData();
}
public class DefaultService : ITheService
{
public void DoSomething() { ... }
public ServerObject GetData()
{
using (var proxy = new ActualServiceClient())
{
return proxy.GetData();
}
}
}
这很好用,我能够有效地测试我的业务对象等。
我的问题源于我从第二种方法返回的类型与服务强耦合。如果适配器返回一个我将要使用的类型的实例而不是来自服务的 DTO/代理,这不是更有意义并且更符合适配器模式吗?
如果是这样,那么我担心封装。在一个典型的用例中,调用该服务来检索数据,然后将这些数据填充到我的业务对象中。如果我想将只读属性暴露给我的 UI,那么我不能将这些属性的分配委托给另一个对象,例如适配器。
想法?
【问题讨论】:
标签: design-patterns tdd soa adapter