我应该将依赖注入容器(DIC)作为 MVC 中的参数传递吗?

Posted

技术标签:

【中文标题】我应该将依赖注入容器(DIC)作为 MVC 中的参数传递吗?【英文标题】:Shall I pass Dependency Injection Container (DIC) as parameter in MVC? 【发布时间】:2015-04-12 05:06:52 【问题描述】:

我目前正在编写自己的 MVC 框架以用于学习目的,我决定使用依赖注入容器在类之间共享常用对象(例如数据库实例)。

我在我的引导文件中初始化了容器,并且在我的Application 类中有一个它的实例,在路由过程中传递一个容器的实例是一个好习惯吗? (即在 ControllerBase 构造函数中将容器对象作为参数传递)。另外,在我的ModelBase 的构造函数中接受容器作为参数是一种好习惯吗?

【问题讨论】:

没有你正在做的事情(传递整个事情)被称为服务定位器,是一种反模式。 容器永远不应该被传递,如果它完成了,那么它应该只是一个延迟加载的细节。澄清一下,在测试 MVC 设置中涉及的任何类时,您永远不必编写与容器相关的任何内容,无论您是否在模拟它。 我已经写了一个关于使用全局变量的答案,它与服务定位器有许多相同的问题。虽然它不是您问题的确切答案,但值得一读,并且肯定与您的问题相关***.com/questions/11923272/… 您的 DIC 的目标是存储将在许多其他实例之间共享的类的已配置实例(如 DB 对象)。如果每次需要服务时都手动实例化服务而不使用 DIC,则会带来许多模式问题。最大的一个,恕我直言,是您在类之间创建硬耦合并防止依赖项(您的 DB 对象)实际被覆盖(从而至少破坏 SOLID 的 S 和 L)。如果还没有完成,我强烈建议您阅读:symfony.com/doc/current/book/service_container.html 一些 MVC 框架确实将容器注入到控制器中。 Symfony 的 BaseController 实现了一个 ContainerAware 接口,就像提到的 @FrancescoPanina 一样。另一方面,Laravel 使用反射来确定控制器的依赖关系,然后在解析控制器时仅从容器中注入依赖关系。 【参考方案1】:

听起来依赖注入器与您正在做的事情不同。它听起来更像是一个 ServiceLocator、一个存储库或其他任何东西。通常,依赖注入器位于调用之间(如果将其用于参数注入)或创建之间(如果将其用于字段或构造函数注入)。

依赖注入器的使用必须对被注入的代码/对象完全透明。所以如果你传递了一个引用,你就做错了。

DependencyInjector 也属于您的代码运行的环境。照原样看。除非您将应用程序用作您运行的框架,否则应用程序甚至不应该知道依赖注入器。

所以让依赖注入工作意味着在实际应用程序中不引用注入器。目标是通过注入或不注入两种方式运行应用程序。周期。

【讨论】:

以上是关于我应该将依赖注入容器(DIC)作为 MVC 中的参数传递吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何编写一个简单的依赖注入容器

将 MVC 视图呈现为 Parallel.ForEach 中的字符串时的依赖注入问题

如何在Signal I hub的Unity IoC容器中注入依赖项?

IOC容器-Autofac在MVC中实现json方式注入使用

PHP中的服务容器与依赖注入的思想

PHP中的服务容器与依赖注入的思想