我正在观看有关依赖注入(inject)的本类(class)视频,并且讲师讨论了di-container,但没有详细解释,现在我阅读了一些文章,并且想确认一下我现在做对了。下面是简单的程序,我的问题是,

下面的Program类是否是最简单的di容器?如果不是,简单的di容器将如何像

interface  Implementable {
    void doSmth();
}

class A implements Implementable {

    @Override
    public void doSmth() {

    }
}

class B {

    private Implementable i;

    public B(Implementable implementable) {
        this.i= implementable;
    }

    public void doSmth(){
        i.doSmth();
    }
}

这是一类双容器吗?
class Program {
    B b = new B(new A());
    b.doSmth();
}

最佳答案

根据Dependency Injection Principles, Practices, and Patterns,DI容器为:



至少,DI容器允许 Autowiring ,即:



通常,这意味着DI容器将分析类型的构造函数并将依赖项注入(inject)其中,而无需手动指定每个构造函数参数。

从这个角度来看,您的Program类不是DI容器,但是您的Program类充当Composer,它是Composition Root的一部分。 Composition Root是:



Composer是“合成根”的一部分,它负责实际构造对象图。



在您的特定合成根目录中,您正在练习Pure DI,而不是使用DI容器:



换句话说,Pure DI是一种使用您语言的new关键字手动组成对象图的实践,而不是像Program类所演示的那样使用DI容器。



DI容器的实现通常相当复杂,并且有许多构建方法。但是,它们的本质在于抽象和具体类型之间的映射。因此,大多数DI容器内部都使用字典或哈希图。 This Stack Overflow answer仅用几行代码就显示了基于字典的简化实现(使用C#)。

关于java - 什么是DI容器?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50718586/

10-13 06:09