什么是 DI 容器?

我正在观看有关依赖注入的课程视频,讲师谈到了但没有详细解释,现在我读了一些文章,我想确认现在我做对了。以下是简单的程序,我的问题是,di-container

下面的程序类是最简单的 di-container 吗?如果不是,简单的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();
    }
}

这个类是 di-container 吗?

class Program {
    B b = new B(new A());
    b.doSmth();
}

答案 1

根据依赖关系注入原则、实践和模式,DI 容器是:

"一个软件库,提供 DI 功能,并允许自动执行对象组合拦截生存期管理中涉及的许多任务。DI容器也称为控制反转(IoC)容器。(§3.2.2)

至少,DI容器允许自动布线,即:

"能够通过利用编译器和[其运行时环境]提供的类型元数据,从抽象和具体类型之间的映射自动编写对象图。(§12.1.2)

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

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

"(最好)在模块组合在一起的应用程序中的唯一位置。(§4.1)

作曲家是合成根的一部分,用于实际构造对象图。

"它是组合根的重要组成部分。Composer 通常是 DI 容器,但它也可以是任何手动构造对象图的方法“(§8)

在特定的组合根中,您不是使用 DI 容器,而是练习纯 DI,即:

"在没有DI容器的情况下应用DI的做法。(§1.1.1)

换句话说,纯 DI 是使用语言的关键字手动编写对象图的做法,而不是使用 DI 容器,正如您的类所演示的那样。newProgram

简单的 di-container [看起来] 会是什么样子

DI 容器实现通常相当复杂,并且有很多方法可以构建它们。然而,它们的本质在于抽象和具体类型之间的映射。因此,大多数 DI 容器在内部使用字典或哈希映射。但是,此 Stack Overflow 答案在短短几行代码中显示了一个简单的基于字典的实现(使用 C#)。


答案 2

推荐