【问题标题】:Looking for help with implementation of Service Locator pattern寻求实现服务定位器模式的帮助
【发布时间】: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


【解决方案1】:

我认为 Dependency Injection 上的 Martin Fowlers 文章解决了您的一些问题。就我个人而言,我不是服务定位器模式的最大粉丝,尤其是在 Java 中,那里有许多高质量的 DI 框架(尽管这可能是一种矫枉过正,但因为你必须考虑这些架构决策来实现服务定位器,您可能最终还是需要切换)。对于您的问题:

1) 我会说在一个依赖于 1) 和 2) 的单独项目中 2)来自提到的文章:

依赖注入和服务 定位器不一定是相互的 独家概念。一个很好的例子 两者一起使用是阿瓦隆 框架。 Avalon 使用服务 定位器,但使用注入来告诉 组件在哪里可以找到定位器。

所以你也可以使用依赖注入来用默认实现填充定位器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-27
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    相关资源
    最近更新 更多