【问题标题】:Replacing Singletons With ServiceLocators when using Dependency Injection使用依赖注入时用 ServiceLocators 替换单例
【发布时间】:2013-10-27 12:39:44
【问题描述】:

我使用 DI 编写了一个大型应用程序。该应用程序由初始化时的引导程序组成,其中注入了大多数依赖项。一切都很好。

但是,有些服务* 我不能简单地到处注入。 一个很好的例子是日志服务。它是一个日志,因此,解决方案中的每个类都可能希望将其用于调试或跟踪目的。并非每个类都是在初始化时创建的,有些是由第三方提供的(应用程序在某种程度上是一个框架)。现在,我的解决方案是使用单例;我什至为单例创建了一些包装类,所以我可以在可能的地方注入它。

我想知道是否有更好的方法是在这些地方使用 ServiceLocator。 这将完全消除单例导致的硬耦合。类将与定位器耦合,是的,但我可以为它们提供任何实现。

*在 DDD 术语中。

P.S.:我在这里使用 .NET,但我不会这样标记它;我相信这个问题适用于任何接受 DI 的语言。

【问题讨论】:

标签: dependency-injection singleton service-locator


【解决方案1】:

在 Java EE 6/7 环境中,横切方面的最佳选择是使用拦截器。横切功能可以很容易地分解为可重复使用的拦截器。我不知道.NET 中是否有类似的东西。

另一方面,设计模式服务定位器已在某种程度上被 CDI替换。该模式将应用程序代码与服务实现的详细信息隔离开来。 CDI 可以提供与服务细节相同级别的隔离,但方式更简单。

以防万一您需要在应用程序的生命周期内维护 bean 的 状态,您应该使用 @Singleton

以上适用于 Java EE 6/7 环境。

【讨论】:

【解决方案2】:

添加到 Paul Vargas... 类似于拦截器的概念是面向方面编程 (AOP),这可能是您想要研究的内容。

我不确定您使用的是哪个 DI 框架。如果您使用的是 Spring .NET,那么该功能肯定是可用的。这很有用,例如,在您进入和退出每个方法调用时添加调试或跟踪级别的日志记录。

http://www.springframework.net/doc/reference/html/aop-quickstart.html

【讨论】:

  • 我实际上在使用 Unity (EntLib);尽管马克评论和大多数答案都是正确的,但问题在于我没有注入的代码。我将不得不在这里燃烧更多的脑容量。不过谢谢你的回答,真的。
猜你喜欢
  • 2015-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-11
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
相关资源
最近更新 更多