php - 如何在 PHP 中正确注入(inject)依赖项

标签 php design-patterns dependency-injection

我在依赖注入(inject)方面遇到了一些问题,我想解决一下。首先要提到的是我实现的依赖注入(inject)容器 (DIC),它能够使用 ReflectionClass 通过构造函数注册和解析依赖项。

$container = new DiC;
$container->register('session', 'CSession');
$container->register('response', 'CResponse');
$container->register('model', 'CSomeModel');
$container->register('view', 'CSomeView');
$container->register('controller', 'CSomeController');

依赖 Controller :

class CSomeController extends CController
{
  public function __construct(CSomeModel $model, CSomeView $view)
  {
    // assign arguments here
  }
}

现在 Controller 可以通过DIC实例化了:

$controller = $container->resolve('controller');

我喜欢这种方法,因为它是自动化的和描述性的,但是类 CController 依赖于特定的类 CSomeModel、CSomeView,这是不好的。 MVC 三元组应该独立​​实例化 - 例如,我不能将 COtherView 传递给 CSomeController。

我的第二个猜测是注入(inject) DIC:

class CSomeController extends CController
{
  public function __construct(DiC $dic)
  {
    // resolve dependencies through $dic
  }
}

这使 DiC 对象成为全局对象,许多人认为这不是实现 DI 的方式。

是否有第三种方法可以消除这两种方法的弱点?

最佳答案

如果您正在寻找“ Autowiring ”,请切换到接口(interface)并实现您的具体模型/ View /等。针对该接口(interface)的类。这样你就可以使用反射来配对双方。

拥有一种在容器级别显式指定依赖项的机制也是有意义的。

关于php - 如何在 PHP 中正确注入(inject)依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16197277/

相关文章:

php - 我正在尝试刷新 PHP 变量

PHP 正则表达式删除彼此相邻的句点

java - android单例与静态方法

c# - 我什么时候应该在 C# 中创建私有(private)方法

.net - 团结 : how to resolve class through base interface

java - 如何在 Micronaut 中使用@Parameter?

php - MySQL 按版本号+名称排序

php - Laravel-8 中 Auth::onceUsingID() 和 Auth::setUser() 有什么区别

javascript - JS 模式提供函数名称作为字符串

c# - 工厂或服务模式或方法注入(inject)?