如何使用依赖解析器?

时间:2015-02-09 15:54:39

标签: c# architecture dependency-injection

我有点问题。对于无损架构,我使用依赖注入。 如何在其他类之间共享此依赖项解析器?这个解析器应该是一个带有某些实例的全局静态列表的静态类,还是我应该这样做非静态并将这个解析器通过属性或构造函数传递给其他类?我认为,你应该这样做非静态,因为如果你使用单独的静态解析器执行此操作,那么你就是对这个解析器的依赖。

2 个答案:

答案 0 :(得分:1)

你可以有两种类型的解析器。

  • 使用如下构造函数解析依赖项的地方:

    MyClass myClass;
    public MyConstructor(MyClass myClass) {
       this.myClass = myClass;
    }
    
  • 或者其他方式是使用setter方法使用setter注入,如:

    public void setMyClass(MyClass myClas) {
         this.myClass = myClass;
    }
    

还有其他设计模式,如工厂或单件,它们使用静态方法,并且基于输入参数,它们可以生成不同的对象,您也可以使用它,但它与DI完全不同,可以帮助DI。

答案 1 :(得分:1)

关于这一点已经有很多人说过和写过,但普遍的共识是拥有一个全球性的“解析器”(例如Service Locator pattern)是anti-pattern

  

服务定位器的问题在于它隐藏了一个类'   依赖项,导致运行时错误而不是编译时错误,   以及使代码更难维护,因为它   当你引入一个突破性的变化时,你会变得不清楚。

您应该使用oposite模式:依赖注入(DI),而不是使用此全局解析器。使用DI,您可以将依赖项注入类中,而让类通过某个解析器请求依赖项。最常见 - 通常最好的方法是使用构造函数注入。这意味着某个类的构造函数将类所需的依赖项定义为类sole constructor中的构造函数参数。

类构造函数应该只包含此类直接使用的依赖项。类依赖项所需的依赖项不应该暴露给该类,因为这只会不必要地增加代码的耦合并使代码更难以测试,更难以推理。

这样做的结果是应用程序中的非类将负责构建和请求它们的依赖项。每个类都将此责任推到调用链上,导致应用程序中的一个位置靠近应用程序的启动路径,负责构建所有对象图:composition root

组合根是你可以使用这种解析器的地方,但这是可选的。