【发布时间】:2010-12-26 07:56:05
【问题描述】:
我想:
- 使所有需要它们的类都可以看到常用的服务,
- 具有最少的样板,并且
- 不牺牲可测试性!
这是一个小项目,我认为 DI 可能有点矫枉过正,但也许我错了?反正我一直关注ServiceLocator pattern as described by Martin Fowler
在客户端类的构造函数中,我有这样的东西:
this->db = Locator::getDb();
this->log = Locator::getLogger();
然后类的其余方法通过这些成员属性访问服务,例如:
this->fooModel = new fooModel(this->db);
fooItem1234 = this->fooModel->findById(1234);
不过,我也希望“模型”对象(如上面的 fooModel)具有这种可见性级别,因为它们可以从多个不同的地方访问,并且不需要多个实例。
所以我最初的想法是扩展 Locator 以拥有 ::getFooModel(),但现在看来我违反了开放/封闭原则,因为每次引入新模型类时我都必须修改 Locator。
为了满足 OCP,我可以使用动态服务定位器(也在 Fowler 的页面上进行了描述),但出于与他相同的原因,我并没有完全接受这一点,即它不够明确。
另一个解决方案是让我所有模型的方法都是静态的。所以:
fooItem1234 = FooModel::findById(1234);
我喜欢这个,因为它是零样板。我可以创建一个新的模型类,然后从任何地方用一行代码开始调用它。但是现在该模型依赖于 Locator 来找到它的数据库连接,我不确定我对此有何感受。一方面,如果我需要在单独的数据库连接上打开两个 fooModel,那将是一团糟和/或不可能。也就是说,我目前实际上不需要这样做,所以这个选项似乎有点诱人。
最后,还有 DI。但就像我上面所说的,我认为这个小项目可能太多了。
结论:我有点卡在这里,希望 StackOverflow 大师的一些建议!
【问题讨论】:
标签: php design-patterns oop dependency-injection