3

我想创建 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() { } }
4

1 回答 1

2

有两种相反的方法,您在问题中都展示了它们。您可以使用Service Locator(第一个示例)解决类内部的依赖关系,也可以使用Dependency Injection从外部注入它们。

依赖注入(在您的情况下为构造函数注入)有几个优点:

  1. 更清楚Facade类需要什么才能正常运行,因为您不需要深入类内部来弄清楚它将尝试解决什么(以及何时)。
  2. 对类进行单元测试更容易Facade,因为您可以通过构造函数注入测试替身;无需在单元测试中配置 DI 容器。

您可以在这篇文章中阅读有关服务定位器的更多信息(以及为什么应该避免使用它)。

于 2017-04-12T11:50:00.173 回答