我想使用 DAO,但如何干净地注入返回的对象依赖项


I want to use DAO's but how do I inject the returned objects dependencies cleanly

好的,所以我有我的依赖注入容器和一个DAO,我像这样使用它来获取订单,例如:

$container = new DIContainer();
$orderDAO = $container->get('orderDAO');
$order = $orderDAO->fetchById($someId);

然后我有我的订单对象,它很容易使用。

问题是如果我的$order对象依赖于LoggerConfig和一两个类似的对象,因为我的$orderDAO实例化了该对象,它不必访问或能够创建这些额外的对象,我很确定$orderDAO对象绝对不知道这些额外的对象, 尤其是不知道如何创建它们。

我知道我可以在实例化时(从 DIC 内部)将依赖注入容器注入 DAO 中,这样我就可以从 DAO 中访问我的对象具有的任何依赖项,但是出于某种原因,这样做对我来说感觉不对,我绝对不想到处做静态调用,所以该方法不在窗口。

最好的

方法是什么?

任何帮助将非常感谢。

允许 DI 容器管理内部对象依赖关系,例如在您实例化的对象中分配记录器、配置和类似的东西 - 是执行这些操作的正常方法。如果出于某种原因您不想允许 DI 容器执行此操作,那么您可以创建默认构造函数并在其中分配此值。

实际上,看起来你需要把一些基础设施的东西放进去,这样的事情最好尽可能简单,没有一些额外的东西,因为它会让你变得不必要的复杂性。


上级:

所以产品DAO无法访问配置等...但你希望那个产品有这个。我认为从设计的角度来看这是非常错误的。因为通常以存储数据为主要目标的实体除了其业务逻辑之外不应具有任何功能。如果你不想做日志记录和配置 - 你应该在DAO中做,而不是在产品中做。但无论如何,如果需要,那么只需为将来可以更改的内容(假设 Logger)创建包装器,然后简单地手动在构造函数中分配此值。