我正在探索依赖注入,并且在整个地方使用术语组合根。那是什么?
答案 0 :(得分:63)
组合根是应用程序中的单个位置,其中使用依赖注入容器进行应用程序的对象图的组合(尽管如何完成此操作是无关紧要的,它可以使用容器或可以完成手动使用pure DI)。
应该只有一个地方发生这种情况,你的容器不应该在组合根之外使用。
引用以下链接中的一个答案:
在实践中,这意味着你 应该在容器配置容器 你应用的根源。
- 在桌面应用中,它将位于Main方法中(或非常靠近它)
- 在ASP.NET(包括MVC)应用程序中,它将在 Global.asax中
- 在WCF中,这将在ServiceHostFactory
中- 等
有一个很好的答案here,可以解释一下这个问题。
另见this answer。
答案 1 :(得分:3)
Mark Seemann写了一篇关于Composition Root设计模式的精彩文章。
本文的要点是:
组合根是应用程序中的(最好)唯一位置 模块组合在一起。
只有应用程序应具有组合根。图书馆和 框架不应该。
DI容器只能从Composition Root引用。 所有其他模块都不应该引用容器。
http://blog.ploeh.dk/2011/07/28/CompositionRoot/
我编写了自己的JavaScript依赖注入框架Di-Ninja并牢记这些原则
https://github.com/di-ninja/di-ninja
据我所知,是javascript中唯一一个实现Composition-Root设计模式的人 它的文档可能是另一个展示其工作原理的好例子。
它适用于NodeJS,浏览器(使用Webpack或UMD / AMD)和React-Native。