【发布时间】:2011-06-09 15:03:24
【问题描述】:
我正在构建一个小型 Web 应用程序。主要是为了提高我的单元测试能力(并进一步解耦我的代码),我正在实现一个服务定位器模式来查找某些依赖项的具体实现。我对 Service Locator 单例类本身非常满意,但我很好奇将它放在哪里以及如何加载它。单例本质上管理接口的哈希图 -> 具体实现。
我的工作区中有几个项目:
1) 一个表示层项目,包含 servlet 代码和表示层处理。 (使用下面的 2 和 3)
2) 一个数据访问层项目,其中包含访问数据库等的代码(使用下面的 3)
3) 一个包含两个层使用的各种数据模型的通用项目。 (没有其他项目参考)
由于服务定位器是为上述项目 1 和 2 中的类的实现提供服务,我想知道最好把它放在哪里?
我坚持的另一个问题是如何最好地使用默认实现加载它。一种选择是将所有默认实现放入单例服务定位器类的构造函数中。例如:
private ServiceLocator() {
services.put(ISomeClass.class, new SomeClass());
....
}
另一种选择是拥有一个单独的类,其职责是加载具有默认实现的 ServiceLocator。但接下来的问题是如何调用它,以便在任何其他类之前加载默认实现。
所以我想我的两个问题是:
1) ServiceLocator 最适合哪个项目?
2) 对于加载具有默认实现的类,您推荐哪些解决方案?
谢谢
【问题讨论】:
-
你考虑过依赖注入吗?
-
@akappa 是的,我确实考虑过。我过去使用过 Guice 并且喜欢它(并且可能会在这里再次使用它)。但是,我只需要注入几个类并考虑自己学习更多关于服务定位器模式的知识。
-
请问您对问题 2 的最终解决方案是什么?资源将不胜感激。
-
@ET13,最后我意识到 Google Guice 确实比我的服务定位器代码更有意义,所以我最终使用了 Guice。易于实施并满足我的所有需求。重读上面的问题,我想我可能会去加载默认实现的构造函数,但可能取决于情况。
标签: java design-patterns service-locator