【发布时间】:2010-07-04 08:31:01
【问题描述】:
这听起来像是一个愚蠢的问题,但是 DI 可以在需要 Singleton 的任何地方使用吗?或者是否存在单例更有意义的用例?我的一位教授说,在少数但有效的情况下,单身人士“足够好”,但我对此并不满意:-/。
【问题讨论】:
标签: design-patterns dependency-injection singleton
这听起来像是一个愚蠢的问题,但是 DI 可以在需要 Singleton 的任何地方使用吗?或者是否存在单例更有意义的用例?我的一位教授说,在少数但有效的情况下,单身人士“足够好”,但我对此并不满意:-/。
【问题讨论】:
标签: design-patterns dependency-injection singleton
DI 中的一个主题是要注入的对象的生命周期。示例生命周期包括 Singleton 以及 Transient、HttpContext、ThreadLocal、Custom 等……因此,当使用 DI 时,您可以指定一个对象为 Singleton 生命周期,可能是在应用程序启动时填充的配置类。作为单身人士,这似乎是一个不错的课程。
单例模式是一种强大的模式,但与所有设计模式一样,如果以不正确的方式使用它们可能弊大于利。 DI 和 Singleton 的避免也带来了更好的可测试性。
现在干杯,
安德鲁
【讨论】:
单例是一种模式。它经常出现在 DI 容器中或作为static API 出现。我假设您指的是static 风格。
通过static 成员暴露的对象为消费者提供了最低可能的摩擦;这就是它们如此吸引人的原因。依赖注入以不同的方式解决了相同的问题(对象访问)。对于 DI,依赖项的生命周期是一个配置细节,而不是固有的事实。
这是我解决此问题的另一个答案:
【讨论】:
只要有可能,我肯定会对单例对象使用依赖注入。即使除了对象的一个特定实现之外,您不太可能注入任何东西,使用注入几乎没有缺点,而且有很多潜在的好处。根据我的经验,依赖注入使阅读代码的人更容易理解依赖关系,使代码更容易重构,提高可测试性,并且通常会缩短构建时间。
也就是说,我遇到了理想情况下希望使用注入但选择不使用的代码。以下是一些示例。
如果您还没有使用过它们,您可能需要查看依赖注入框架。我很高兴在 Java 代码中使用 Google Guice。
【讨论】: