Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java DI容器与工厂_Java_C#_Dependency Injection_Di Containers - Fatal编程技术网

Java DI容器与工厂

Java DI容器与工厂,java,c#,dependency-injection,di-containers,Java,C#,Dependency Injection,Di Containers,我知道依赖注入上有很多ARICLE和线程,但依赖注入容器上没有那么多。我发现它非常有用,尽管它的目标是PHP。然而,当我读到更多关于这些容器的文章时,我得出这样的结论:这些容器仅仅是工厂方法的简单集合,这是真的吗 更深入、更具体的观点: 向对象注入依赖项时 foo.Bar = new Dependency(); 我也会写作 foo.Bar = new myFactory.CreateDependency(); 或者用一个容器 foo.Bar = myContainer.CreateDepen

我知道依赖注入上有很多ARICLE和线程,但依赖注入容器上没有那么多。我发现它非常有用,尽管它的目标是PHP。然而,当我读到更多关于这些容器的文章时,我得出这样的结论:这些容器仅仅是工厂方法的简单集合,这是真的吗

更深入、更具体的观点: 向对象注入依赖项时

foo.Bar = new Dependency();
我也会写作

foo.Bar = new myFactory.CreateDependency();
或者用一个容器

foo.Bar = myContainer.CreateDependency();

在这里,上一种方法中的容器不仅有一个,还有许多其他方法来创建其他类型,因此它只是工厂方法的容器,对吗?

DI容器可以被视为一大组智能工厂方法,它使用多种方式(代码、xml、自动映射)进行配置。我称这些工厂方法为智能方法,因为容器跟踪其注册的类型,并使用它们创建更复杂的对象。
当使用工厂时,您需要自己设置这些依赖项,否则您已经在使用依赖项容器。

DI容器的全部要点是您永远不需要/应该编写类似这样的代码

foo.Bar = myContainer.CreateDependency();
它被认为是一种反模式。DI容器在组合根目录中只能使用一次(它是主要的DI容器使用模式)

DI容器根据配置通过构造函数或属性自动构造对象并注入依赖项。在工厂里,你必须自己做每件事。除了创建DI容器之外,它还为您提供:

终身管理。所以每次需要依赖项时,容器都可能注入相同的对象(单例生存期),或者每次都返回新的

有限的AOP功能,如方法调用拦截和在方法前后执行自定义逻辑


你可以看看这本书。这对我理解DI容器、使用模式和依赖注入有很大帮助。

理想情况下,代码应该不知道它正在使用DI运行。
它只是将其依赖项外部化,并假设它们是被提供的

您可以将DI容器/库视为一个工厂框架,包含许多高级对象构造方法(通过反射)。它很有用,因为通常您不必编写任何高级方法,例如,加载插件程序集和获取插件数据类型。但缺点是反射速度慢,在应用程序初始化阶段使用反射是合理的。但是,如果您想在运行时使用它创建许多小对象,它会降低您的速度

另一方面,您自己的工厂是定制的,通常包含具体实现的列表和大型开关箱,或地图或类似的东西。它们工作得更快,但您必须自己编写所有对象构造逻辑


你不必在这两个选项中做出选择,你可以将它们结合起来。例如,您可以通过DI构建复杂的工厂,但contaienr如何知道何时构建任何类的新实例?当然,应该显式调用DI容器,这应该在某个“入口点”完成。例如,在web应用程序中,这一点是创建一个名为container.resolve的控制器。但某些控制器本身并不知道使用了DI容器。这就是构成根模式的本质。