使用依赖注入时用ServiceLocator替换单例

时间:2013-10-18 15:37:47

标签: dependency-injection singleton service-locator

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

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

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

* 在DDD术语中。

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

2 个答案:

答案 0 :(得分:0)

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

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

如果您需要在应用程序的生命周期内维护bean的状态,则应使用@Singleton

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

答案 1 :(得分:0)

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

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

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