具有内部两个服务和依赖注入的外观 - 设计模式方法

Posted

技术标签:

【中文标题】具有内部两个服务和依赖注入的外观 - 设计模式方法【英文标题】:Facade with two services inside and dependency injection - design pattern approach 【发布时间】:2017-09-07 20:14:04 【问题描述】:

我想创建 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】:

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

依赖注入(在您的情况下为constructor injection)有几个优点:

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

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

【讨论】:

以上是关于具有内部两个服务和依赖注入的外观 - 设计模式方法的主要内容,如果未能解决你的问题,请参考以下文章

PHP外观模式

依赖注入[5]: 创建一个简易版的DI框架[下篇]

一个游戏所用到的设计模式

laravel的Facades外观模式背后实现原理

laravel的Facades外观模式背后实现原理

外观模式