门面有两个服务内部和依赖注入 - 设计模式方法

时间:2017-04-12 07:20:56

标签: c# design-patterns dependency-injection facade proxy-pattern

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

1 个答案:

答案 0 :(得分:1)

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

依赖注入(在您的案例中为constructor injection)几乎没有什么优势:

  1. 更清楚Facade班级需要什么才能正常运作,因为你不需要深入课堂内去弄清楚它会尝试解决什么(以及什么时候) 。
  2. Facade类进行单元测试更容易,因为您可以通过构造函数注入测试双精度;在单元测试中无需配置DI容器。
  3. 您可以在this post中详细了解服务定位器(以及您应该避免使用它的原因)。