我正在构建一个小型PHP框架(是的,还有另一个框架),主要是为了学习目的,而且我试图以正确的方式来实现它,所以我想使用一个DI容器,但我不是问要使用哪个容器,而是询问如何使用一个容器。
在不涉及太多细节的情况下,mvc被划分为具有控制器的模块,这些控制器为操作提供视图。以下是处理请求的方式:
目前,我还没有设置任何DI容器,但我确实拥有一堆initX()方法,这些方法创建了所需的组件(如果还没有的话)。例如,模块具有initViewRenderer()方法。这些init方法是在需要该组件之前调用的,而不是在此之前调用的,如果组件已经设置,它将不会初始化它。这允许切换组件,但如果组件不存在,则不需要手动设置它们。
现在,我想通过实现DI容器来做到这一点,但仍然将手动配置保持在最低限度,因此如果遵循目录结构和命名约定,那么一切都应该正常工作,甚至不会触及配置。
如果我使用DI容器,那么是否将它注入到所有东西中(容器在创建组件时会注入自己),以便其他组件可以使用它?何时向DI注册组件?组件可以在运行时向DI注册其他组件吗?我是否创建了一个“公共”配置并使用它?然后如何动态地确定我需要哪些组件,以及它们需要如何设置?
如果Main使用使用请求的路由器,则Main需要使用容器来获取模块(还是需要事先找到并设置模块?怎么做?)模块使用路由器,但需要确定ViewRenderer和控制器的设置,而不是提前,所以在模块确定控制器和操作之前,我的DI容器不能在模块上设置这些设置。
如果控制器需要其他服务怎么办?我要把容器注入每个控制器吗?如果我开始这么做的话,我可能会把它注入所有的东西.
基本上,我是在寻找最佳实践时,处理这样的事情。我知道DI是什么以及DI容器是干什么的,但是我正在寻找在现实生活中使用DI的指导,而不是网络上的一些孤立的例子。
很抱歉给您发了很长的帖子,并提前感谢您。
编辑:在阅读了更多之后,似乎将容器本身注入对象并让它们使用容器查找东西实际上是服务位置,而不是依赖注入。所以我的最新想法是使用工厂来处理应该根据某些东西动态获取的东西(比如根据路由器所说的内容来获得控制器),然后容器就会被注入到工厂中,在工厂中它将更像一个服务定位器。非动态组件将预先注册,这些组件将由容器构建并返回完全可操作,并填充它们的所有依赖项。
所以流程看起来是这样的:
我拿着这个有进展吗?
发布于 2012-09-04 19:59:16
我知道这是一种反论点,但我认为对你来说,超越DI是有益的。
请考虑DI的属性以及您试图应用它的目的。
这是一段视频,讨论了编程风格的不同方面(大约25分钟,为DI制作的例子) http://www.infoq.com/presentations/Value-Values
https://softwareengineering.stackexchange.com/questions/163401
复制相似问题