在依赖注入的背景下,什么是复合根?


Answers:


73

组合根是应用程序中使用依赖项注入容器进行应用程序对象图组合的唯一位置(尽管此操作无关紧要,它可以使用容器,也可以使用容器手动完成。DI)。

只能在一个地方发生这种情况,并且您的容器不需要在合成根目录之外使用。

引用以下链接之一的答案:

实际上,这意味着您应该在应用程序的根目录下配置容器。

  • 在桌面应用程序中,这将在Main方法中(或非常接近)
  • 在ASP.NET(包括MVC)应用程序中,该文件位于Global.asax中
  • 在WCF中,它将位于ServiceHostFactory中
  • 等等

这里有一个很好的答案 它对此进行了更多解释。

另请参阅此答案


在Web应用程序(如PHP框架)中呢?组成根应该是index.php吗?
CMCDragonkai 2013年

@CMCDragonkai虽然我没有PHP的经验,index.php但听起来并不是一个拥有它的好地方。
奥斯卡·梅德罗斯

或类似bootstrap.php之类的东西,可以在index.php中找到。
CMCDragonkai 2013年

@CMCDragonkai,对于PHP MVC框架,我通常使用bootstrap include作为设置依赖项的地方。但是,如果不使用DI容器(手动进行接线时),则在您已经知道将使用哪种控制器的情况下,将其放置在其他位置可能会很有用,这样您就只能设置相关对象,否则可能会实例化很多不会使用的对象。这不是支持延迟加载的DI容器的问题,也不是小型应用程序的问题(对于小型应用程序,index.php可能是个好地方)。只需记住只有一个CR。
MV。

很好的解释,谢谢,但是如果要更改注入服务(例如在一处重新初始化),如何确保需要更新注入服务的所有客户项目中的注入服务是最新的呢?
lukaszk 2014年

4

马克·西曼(Mark Seemann)写了一篇很棒的文章,关于合成根设计模式。

本文的要点是:

组合根是应用程序中组合模块的(最好)唯一位置。

仅应用程序应具有合成根。库和框架不应该。

DI容器仅应从成分根引用。所有其他模块都不应引用该容器。

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一起使用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.