2015-05-07 218 views
0
  1. 当使用依赖注入当一个类用户在构造函数需要一个对象的一个​​新实例和什么时候不需要时如何理解?

例如,类Car需要一个实现IEngine接口的类的新实例。注入新对象VS使用依赖注入时注入现有对象?

public class Car 
    public sub new(Engine as IEngine) 
    end sub 
end class 

同时,类Messager不需要实现​​接口的类的新实例。

public class Messager 
    public sub new(Logger as ILogger) 
    end sub 
end class 
  • 如何开发者或用户最小化误用的危险?
  • 回答

    1

    当使用依赖注入如何做时 构造函数需要一个对象的新实例,当不是一类用户理解?

    如果类要求其依赖的一个新实例,你打破了Dependency Inversion Principle,因为你正在泄漏的实施细则进入消费类。这个班不应该知道,也不应该关心这个。

    在运行时,您可能会构建一个无法重用的特殊引擎类型,但要知道这一点取决于Composition Root;消费者不应该在意。

    也许你遇到的问题是由运行时数据注入到服务中引起的。通过依赖注入,您可以构建组件的对象图(具有行为的类),并通过方法调用将对象图中的数据对象(如消息,DTO,实体等)传递给对象图。任何时候,通过将状态(即运行时数据)注入到组件的构造函数中来破坏这个规则,你会发现自己陷入困境。

    然而,一个常见的错误来源是一个叫Captive Dependencies的问题。捕获依赖项是一种依赖项,配置为具有比其使用类型更短的生命周期。例如,您的Car可能会被注册为单身人士,而IEngine是暂时的。在这种情况下,Car将使IEngine长时间存活。

    有几种方法可以防止这种情况发生。例如,当手动构建对象图时,您经常会发现这些错误很容易弹出;但不幸的是并不总是。

    如果您使用DI库,某些库(简单注入器和Castle Windsor)包含诊断工具,这些工具会警告您这种错误。

    防止这种情况的另一个好方法是防止组件保持任何状态。这允许你使这个完整的对象图由单例组成,并且这将防止首先陷入这个问题。这并不意味着你不能拥有生活方式较短的对象(例如工作单元),但只需要防止这些对象被注入对象图中组件的构造函数。

    +0

    你是对的!我是在构造函数中注入数据对象!从来没有想过这是错的。 – Lightman