【问题标题】:I want to use DAO's but how do I inject the returned objects dependencies cleanly我想使用 DAO,但如何干净地注入返回的对象依赖项
【发布时间】:2013-01-13 12:37:55
【问题描述】:

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

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

然后我就有了易于使用的订单对象。

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

我知道我可以在实例化 DAO 时(从 DIC 中)将依赖注入容器注入到 DAO 中,这样我就可以从 DAO 中访问我的对象所具有的任何依赖项,但这样做的一些方法出于某种原因,我觉得不对劲,我也绝对不想到处都进行静态调用,这样该方法就被排除在外了。

最好的方法是什么?

任何帮助将非常感谢。

【问题讨论】:

  • 您确定不会更改为 J2EE 环境吗? :) 但这很有趣。我自私地为此编写了一个框架。 (几年前)没有事件知道“DAO”这个词。

标签: php oop dependency-injection dao


【解决方案1】:

允许 DI 容器管理内部对象依赖项,例如在您实例化的对象中分配 Logger、Config 和类似的东西 - 是做这些事情的正常方式。如果由于某种原因您不想让 DI 容器这样做,那么您可以创建默认构造函数并在其中分配此值。

实际上,您似乎需要在内部放入一些基础设施的东西,以这种方式,最好尽可能简单地做,而不需要额外的东西,因为它会让您变得不必要的复杂性。


UPD:

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

【讨论】:

  • 感谢您的回复,“放入一些基础设施”是什么意思?
  • 对我来说,日志、配置等...任何与业务逻辑无关的东西 - 都是项目基础架构的某些部分。我把它称为基础设施)
  • 好的,但是你能给我举个例子说明你的意思吗,因为我不确定我是否完全理解你。
  • 什么例子?使用 DI 容器管理依赖还是创建构造函数?
  • 我知道如何使用 DI 容器管理依赖关系,但问题是当我使用像 $productDAO = $container->get('productDAO'); $product = $productDAO->fetchById($id); 这样的 DAO 时。 productDAO 创建一个产品对象并使用数据库中有关该产品的数据填充其属性,但我想知道的是如何为该产品对象提供其依赖项,因为它是在 productDAO 中创建的,而 productDAO 无权访问Config 和 Logger 对象等
猜你喜欢
  • 1970-01-01
  • 2013-09-06
  • 1970-01-01
  • 2011-11-22
  • 1970-01-01
  • 2014-07-16
  • 2013-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多