PHP和DIC中的依赖注入

时间:2016-08-22 09:07:54

标签: php dependency-injection

我有一个可以选择依赖注入的骨头。似乎这样一个简单的概念导致了许多人之间的混淆,而且它的“正确”方式似乎在复杂性方面失控。为了使事情变得非常简单,我只想知道:

如果我使用标准函数来注册我的依赖项,这是不错的做法,如下所示:

function someObject() {
  return new someObject();
}

我可以传递参数吗?

function someObject($param1) {
  return new someObject($param1);
}

最后如何使用简单的自定义容器类:

class Dependencies {
  function someObject($param1) {
    return new someObject($param1);
  }
}

使用它:

class SomeClass {
  public function __construct(Dependencies $dependencies) {
    $this->dependencies = $dependencies
  }

  public function methodNeedsDependency() {
    $param1 = 'one';
    $task = $this->dependencies->someObject($param1);
  }
}

我想我要问的是,这是对非常简单的 DIC实现的一次不错的尝试吗?或者表面上是否存在一些潜在的主要问题?

谢谢!

1 个答案:

答案 0 :(得分:2)

如果SomeClass是一个工厂,设计用于创建一些具有一些确切配置的实例,那么是的,我们可以说这是DIC的非常简单的实现。

问题在这里?好吧,假设你想用其他构造函数参数创建someObject

解决方案:

  1. 创建另一个传递其他参数的SomeClass工厂。这是一个冗余的解决方案,它还混合了两个应用层(配置了对象创建层)。

  2. 使用将传递给methodNeedsDependency的参数来参数化someObject。它允许您在代码配置创建中推迟。

  3. 并且最后但最合适的方式:DIC应该是灵活的,应该允许您创建具有任何依赖关系的任何服务实例,并且所有配置都应该存储在配置层中。关注点分离 - 尝试让DIC不知道正在创建的对象类型。让他制作你在其他地方描述的物品。

  4. 还有很多其他问题,例如,如果您希望只有一个给定类的实例用于整个DIC(它很容易“如果”它,但这是正确解决方案的另一种解决方法)或者什么有循环引用。

    这个讨论可以继续讨论有关体系结构的其他问题,比如“服务应该是无状态的”,这样就不需要多于一个,但回答你的问题的是这3点。当然记住它不是DIC的最终超级大师的答案。这只是我看待它的方式; - )