我有一个可以选择依赖注入的骨头。似乎这样一个简单的概念导致了许多人之间的混淆,而且它的“正确”方式似乎在复杂性方面失控。为了使事情变得非常简单,我只想知道:
如果我使用标准函数来注册我的依赖项,这是不错的做法,如下所示:
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实现的一次不错的尝试吗?或者表面上是否存在一些潜在的主要问题?
谢谢!
答案 0 :(得分:2)
如果SomeClass
是一个工厂,设计用于创建一些具有一些确切配置的实例,那么是的,我们可以说这是DIC的非常简单的实现。
问题在这里?好吧,假设你想用其他构造函数参数创建someObject
。
解决方案:
创建另一个传递其他参数的SomeClass
工厂。这是一个冗余的解决方案,它还混合了两个应用层(配置了对象创建层)。
使用将传递给methodNeedsDependency
的参数来参数化someObject
。它允许您在代码配置创建中推迟。
并且最后但最合适的方式:DIC应该是灵活的,应该允许您创建具有任何依赖关系的任何服务实例,并且所有配置都应该存储在配置层中。关注点分离 - 尝试让DIC不知道正在创建的对象类型。让他制作你在其他地方描述的物品。
还有很多其他问题,例如,如果您希望只有一个给定类的实例用于整个DIC(它很容易“如果”它,但这是正确解决方案的另一种解决方法)或者什么有循环引用。
这个讨论可以继续讨论有关体系结构的其他问题,比如“服务应该是无状态的”,这样就不需要多于一个,但回答你的问题的是这3点。当然记住它不是DIC的最终超级大师的答案。这只是我看待它的方式; - )