4

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

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

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

*在 DDD 术语中。

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

4

2 回答 2

0

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

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

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

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

于 2013-10-22T20:38:56.023 回答
0

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

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

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

于 2013-10-29T14:07:44.460 回答