我想要:
- 让所有需要它们的类都能看到常用的服务
- 最少的样板代码
- 不牺牲可测试性!
这是一个小项目,我认为 DI 可能有点过头了,但也许我错了?无论如何,我一直在关注 Martin Fowler 描述的 ServiceLocator 模式
在客户端类的构造函数中,我有类似于这样的代码:
this->db = Locator::getDb();
this->log = Locator::getLogger();
然后,类的其余方法通过这些成员属性访问服务,例如:
this->fooModel = new fooModel(this->db);
fooItem1234 = this->fooModel->findById(1234);
然而,我也希望对于“model”对象(如上面的fooModel)具有这种级别的可见性,因为它们从几个不同的地方访问,并且没有必要拥有多个实例。
所以我的最初想法是扩展Locator来拥有一个::getFooModel(),但现在似乎我正在违反开闭原则,因为每次引入新的模型类都必须修改Locator。
为了满足OCP,我可以使用动态服务定位器(也在Fowler的页面上描述),但出于与他相同的原因,即它不够明确,我并不完全赞同这一点。
另一种解决方案是使我所有模型的方法静态。 所以:
fooItem1234 = FooModel::findById(1234);
我喜欢这个库,因为它没有样板代码。我只需要创建一个新的模型类,就可以在任何地方使用一行代码调用它。但是现在这个模型依赖于Locator来查找它的数据库连接,我对此感到有些犹豫。首先,如果我需要在不同的数据库连接上打开两个fooModels,那将会非常混乱或者不可能。尽管如此,目前我并不需要这样做,所以这个选项似乎有点诱人。
最后,还有DI。但像我上面说的,我认为这对于这个小项目来说可能太过复杂了。
结论:我有点困惑,希望从StackOverflow的大牛那里得到一些建议!