在使用依赖项注入容器时使依赖项显式化

时间:2012-03-18 05:46:07

标签: java php dependency-injection

依赖注入的一个好处是,类的依赖关系在其接口(即构造函数)中显式定义。但是,如果使用依赖注入容器,则许多这些依赖项将合并为一个依赖项(容器)。因此,许多类的真正依赖项隐藏在容器后面。这是如何避免的,以便在使用依赖注入容器时仍然明确定义依赖关系?

3 个答案:

答案 0 :(得分:0)

您的bean定义中似乎可以使用'depends-on'属性在代码中添加显式依赖项。我在这里找到了类似的问题

Declaring an explict object dependency in Spring

答案 1 :(得分:0)

是和否,这实际上取决于依赖注入容器的工作方式。

我认为这种代码没有任何问题:

class Class1 {
    /**
     * @Inject
     * @var Class2
     */
    private $class2;
}

即使依赖项将由容器注入,Class1依赖于Class2的事实也是相当明确的。 (此处使用的依赖注入容器是PHP-DI

答案 2 :(得分:0)

3年前我问过这个问题,后来逐渐理解并喜欢静态类型语言中的DI。

看起来当我问这个问题时,我并没有理解“服务定位器”与“服务定位器”之间的区别。和一个依赖注入容器' (DIC)。

DIC在"以下"应用程序并负责构建对象和构建对象图,通常在引导期间但在应用程序完全引导之前。 类不应该知道DIC并且不应该依赖它。 DIC应该构造所有类的依赖关系并注入它们,好像该类是手动实例化一样。

服务定位器是一个在系统中传递并用于查找依赖关系的对象。使用服务定位器掩盖了依赖关系(我在学习这些东西时注意到的原始问题)并创建了系统范围的依赖关系(即服务定位器本身)。

通常,我会避免使用服务定位器模式(有些人称之为"反模式")。使用像Ninject或Symfony 2这样的DIC这样的好DIC会让你的课程专注于其中的业务逻辑 - 而不是寻找依赖关系。

阅读Martin Fowlers关于依赖注入的文章:http://www.martinfowler.com/articles/injection.html