具有内部两个服务和依赖注入的外观 - 设计模式方法
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 中阅读有关服务定位器的更多信息(以及为什么应该避免使用它)。
【讨论】:
以上是关于具有内部两个服务和依赖注入的外观 - 设计模式方法的主要内容,如果未能解决你的问题,请参考以下文章