我正在构建一个小型Web应用程序。主要是为了提高我的单元测试能力(并且还可以进一步解耦我的代码)我正在实现一个服务定位器模式来查找某些依赖项的具体实现。我对Service Locator单例类本身很满意,但我很好奇它放在哪里以及如何加载它。单例基本上管理接口的哈希映射 - >具体实施。
我的工作区中有几个项目:
1)一个表示层项目,它包含servlet代码和表示层处理。 (使用下面的2和3)
2)数据访问层项目,其中包含访问数据库等的代码(使用下面的3)
3)包含两个层使用的各种数据模型的通用项目。 (没有其他项目参考)
由于服务定位器要在上面的项目1和2中提供类的实现,我想知道最好把它放在哪里?
我坚持的另一个问题是如何最好地使用默认实现加载它。一种选择是将所有默认实现放入单例服务定位器类的构造函数中。 E.g:
private ServiceLocator() {
services.put(ISomeClass.class, new SomeClass());
....
}
另一个选择是拥有一个单独的类,其职责是使用默认实现加载ServiceLocator。但接下来的问题是如何调用它,以便在任何其他类之前加载默认实现。
所以我想我的两个问题是:
1)ServiceLocator最适合哪个项目?
2)您建议使用默认实现加载类的哪些解决方案?
感谢
答案 0 :(得分:1)
我认为Martin Fowlers关于Dependency Injection的文章解决了你的一些问题。就个人而言,我不是服务定位器模式的最大粉丝,特别是在Java中,那里有许多高质量的DI框架(虽然它确实可能是一种矫枉过正,但是因为你必须考虑这些类型的架构决策来实现服务定位器你可能最终还是需要切换)。对你的问题:
1)我会在一个单独的项目中说,它依赖于1)和2) 2)从提到的文章:
依赖注入和服务 定位器不一定是相互的 独家概念。一个很好的例子 同时使用两者是Avalon 框架。 Avalon使用服务 定位器,但使用注射来告诉 组件在哪里找到定位器。
因此,您还可以使用依赖注入来使用默认实现填充定位器。