使用依赖注入时使用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