首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用DI和DI容器

如何使用DI和DI容器
EN

Software Engineering用户
提问于 2012-09-02 19:24:40
回答 1查看 1.1K关注 0票数 6

我正在构建一个小型PHP框架(是的,还有另一个框架),主要是为了学习目的,而且我试图以正确的方式来实现它,所以我想使用一个DI容器,但我不是问要使用哪个容器,而是询问如何使用一个容器。

在不涉及太多细节的情况下,mvc被划分为具有控制器的模块,这些控制器为操作提供视图。以下是处理请求的方式:

  • 主对象实例化请求对象和路由器,并将请求注入路由器以确定调用了哪个模块。
  • 然后实例化Module对象并将请求发送到
  • 模块创建一个ModuleRouter并发送请求来确定控制器和操作
  • 然后创建Controller和ViewRenderer,并将ViewRenderer注入控制器(以便控制器可以向视图发送数据)
  • ViewRenderer需要知道调用了哪个模块、控制器和操作来确定视图脚本的路径,因此模块必须弄清楚这一点,并将其注入ViewRenderer
  • 然后,模块调用控制器上的action方法,并在ViewRenderer上调用呈现方法。

目前,我还没有设置任何DI容器,但我确实拥有一堆initX()方法,这些方法创建了所需的组件(如果还没有的话)。例如,模块具有initViewRenderer()方法。这些init方法是在需要该组件之前调用的,而不是在此之前调用的,如果组件已经设置,它将不会初始化它。这允许切换组件,但如果组件不存在,则不需要手动设置它们。

现在,我想通过实现DI容器来做到这一点,但仍然将手动配置保持在最低限度,因此如果遵循目录结构和命名约定,那么一切都应该正常工作,甚至不会触及配置。

如果我使用DI容器,那么是否将它注入到所有东西中(容器在创建组件时会注入自己),以便其他组件可以使用它?何时向DI注册组件?组件可以在运行时向DI注册其他组件吗?我是否创建了一个“公共”配置并使用它?然后如何动态地确定我需要哪些组件,以及它们需要如何设置?

如果Main使用使用请求的路由器,则Main需要使用容器来获取模块(还是需要事先找到并设置模块?怎么做?)模块使用路由器,但需要确定ViewRenderer和控制器的设置,而不是提前,所以在模块确定控制器和操作之前,我的DI容器不能在模块上设置这些设置。

如果控制器需要其他服务怎么办?我要把容器注入每个控制器吗?如果我开始这么做的话,我可能会把它注入所有的东西.

基本上,我是在寻找最佳实践时,处理这样的事情。我知道DI是什么以及DI容器是干什么的,但是我正在寻找在现实生活中使用DI的指导,而不是网络上的一些孤立的例子。

很抱歉给您发了很长的帖子,并提前感谢您。

编辑:在阅读了更多之后,似乎将容器本身注入对象并让它们使用容器查找东西实际上是服务位置,而不是依赖注入。所以我的最新想法是使用工厂来处理应该根据某些东西动态获取的东西(比如根据路由器所说的内容来获得控制器),然后容器就会被注入到工厂中,在工厂中它将更像一个服务定位器。非动态组件将预先注册,这些组件将由容器构建并返回完全可操作,并填充它们的所有依赖项。

所以流程看起来是这样的:

  • 从容器中获取Main,Main被注入请求、路由器和ModuleFactory,它们使用容器查找模块。这都是预先配置的
  • Main使用ModuleFactory创建模块,注入ModuleRouter、Request、ControllerFactory和ViewRenderer。
  • 模块使用ControllerFactory创建Controller,注入它所依赖的任何服务,然后模块调用控制器上的操作,并将结果发送给ViewRenderer以呈现视图。

我拿着这个有进展吗?

EN

回答 1

Software Engineering用户

发布于 2012-09-04 19:59:16

我知道这是一种反论点,但我认为对你来说,超越DI是有益的。

请考虑DI的属性以及您试图应用它的目的。

这是一段视频,讨论了编程风格的不同方面(大约25分钟,为DI制作的例子) http://www.infoq.com/presentations/Value-Values

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/163401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档