我正在观看有关依赖注入(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/