我想创建Facade类来处理两个服务上的少量操作。 为了联系这些服务,我有代理课程。
每个服务都有抽象代理和派生代理 - 如何创建这部分体系结构,以避免在Facade中解析?
class Facade
{
private Proxy proxy1;
private Proxy proxy2;
public Facade()
{
//I don't like this part
proxy1 = ...Resolve<Proxy1Type>();
proxy2 = ...Resolve<Proxy2Type>();
}
public void Do()
{
proxy1.Call();
proxy2.Call();
}
}
abstract class Proxy {public void Call();}
class Proxy1Type : Proxy {public void override Call(){}}
class Proxy2Type : Proxy {public void override Call(){}}
我应该用什么样的设计模式来解决这个问题?
修改
除此之外,我应该选择这个解决方案,但仍然不喜欢它
class Facade
{
private IProxy proxy1;
private IProxy proxy2;
//I feel it's still wrong
public Facade(IProxy1Type p1, IProxy2Type p2)
{
proxy1 = p1;
proxy2 = p2;
}
public void Do()
{
proxy1.Call();
proxy2.Call();
}
}
interface IProxy { void Call();}
interface IProxy1Type : IProxy{}
interface IProxy2Type : IProxy {}
class Proxy1Type : IProxy1Type { public void Call() { } }
class Proxy2Type : IProxy2Type { public void Call() { } }
答案 0 :(得分:1)
有两种相反的方法,你在问题中都展示了它们。您可以使用Service Locator(第一个示例)解析类中的依赖关系,或使用Dependency Injection从外部注入。
依赖注入(在您的案例中为constructor injection)几乎没有什么优势:
Facade
班级需要什么才能正常运作,因为你不需要深入课堂内去弄清楚它会尝试解决什么(以及什么时候) 。 Facade
类进行单元测试更容易,因为您可以通过构造函数注入测试双精度;在单元测试中无需配置DI容器。您可以在this post中详细了解服务定位器(以及您应该避免使用它的原因)。