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

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

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

我想知道是否更好的方法是在这些地方使用ServiceLocator。 这将完成删除单身人士造成的硬连接。 类会与定位器耦合,是的,但我可以为它们提供任何实现。

*在DDD术语中。

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


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

换句话说,CDI在一定程度上取代了设计模式Service Locator。 该模式从服务实现的细节中分离出应用程序代码。 CDI可以提供与服务细节相同的隔离级别,但更容易。

为了防止在应用程序的生命周期中维护bean的状态,应该使用@Singleton

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


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

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

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

链接地址: http://www.djcxy.com/p/77711.html

上一篇: Replacing Singletons With ServiceLocators when using Dependency Injection

下一篇: Dependency injection and named loggers