【发布时间】:2012-02-02 18:52:15
【问题描述】:
我正在尝试尽可能多地使用依赖注入,但在涉及短期依赖等问题时我遇到了麻烦。
例如,假设我有一个博客管理器对象,它想要生成它在数据库中找到的博客列表。这样做的选项(据我所知)是:
- 新博客();
- $this->loader->blog();
- 加载器对象创建各种其他类型的对象,如数据库对象、文本过滤器等。
- $this->blogEntryFactory->create();
但是,#1 不好,因为它会产生强耦合。 #2 看起来仍然很糟糕,因为这意味着必须预先注入对象工厂——暴露它可以创建的所有其他对象。
数字 3 看起来不错,但如果我使用 #3,我是否将“新”关键字放入 blogEntryFactory 本身,或者,我是否将加载程序注入 blogEntryFactory 并使用加载程序?
如果我有许多不同的工厂,例如 blogEntryFactory(例如,我可以有 userFactory 和 commentFactory),那么在所有这些不同的工厂中放置“new”关键字似乎会产生依赖性问题。
我希望这是有道理的......
注意
我已经得到了一些关于这个特定博客示例不需要这样做的答案,但事实上,在某些情况下您应该使用抽象工厂模式,这就是我要表达的观点。在这种情况下你是使用“新”,还是做其他事情?
【问题讨论】:
-
如果我没有正确或透彻地解释这一点,请告诉我,我会尽力澄清
-
我从未见过在模型类上使用依赖注入。除非
Blog类封装了一些业务逻辑(模型很少这样做),否则尝试减少与它的耦合是没有意义的——没有可耦合的行为。 (只有实体的结构,但这不会改变。) -
首先,感谢您的评论...那么您是说 BlogManager 应该/可以调用“new Blog()”吗?
-
如果
Blog只是一个没有行为的“愚蠢”数据结构,并且您认为它永远不会有任何行为,那么是的。 -
在什么情况下您需要一个模型实体的模拟实现没有行为?您也可以检查实际实现的属性。 (再一次,这是假设
Blog并没有真正封装任何东西,而是将一些数据聚集在一起。)
标签: php design-patterns dependency-injection abstract-factory