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

Dependency injection 使用依赖项注入时用ServiceLocator替换单例,dependency-injection,singleton,service-locator,Dependency Injection,Singleton,Service Locator,我使用DI编写了一个大型应用程序。应用程序在初始化时由引导程序组成,其中注入了大多数依赖项。一切都很好 然而,有些服务*我不能简单地到处注入。日志服务就是一个很好的例子。它是一个日志,因此,解决方案中的每个类都可能希望使用它进行调试或跟踪。并非每个类都是在初始化时创建的,有些是由第三方提供的(应用程序在某种程度上是一个框架)。现在,我的解决方案是使用单例;我甚至为singleton创建了一些包装器类,以便尽可能地注入它 我想知道是否更好的方法是在这些地方使用ServiceLocator。这将完全

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

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

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

*在DDD术语中


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

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

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

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


以上内容适用于JavaEE6/7环境。

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

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


两种选择都不好。日志记录是一个跨领域的问题,因此最好作为一个装饰者来处理:我实际上使用的是Unity(EntLib);虽然Mark comment和大多数答案都是正确的,但问题在于我没有注入的代码。我得在这里烧更多的脑块。但是谢谢你的回答,真的。保罗,你能通过CDI给我发一些信息吗?我不熟悉缩写词。请参阅JavaEE平台和中的更多内容。什么是“CDI”?在介绍首字母缩略词时,最好描述其缩写。