你能在需要单身的地方使用依赖注入吗?

时间:2010-07-04 08:31:01

标签: design-patterns dependency-injection singleton

这可能听起来像一个愚蠢的问题,但DI可以在需要Singleton的地方使用吗?或者是否存在Singleton更有意义的用例?我的一位教授说,有一些但有效的案例,单身人士“足够好”,但我对此不满意: - /。

3 个答案:

答案 0 :(得分:3)

DI中的一个主题是将要注入的对象的生命周期。示例生命周期包括Singleton以及Transient,HttpContext,ThreadLocal,Custom等...因此,当使用DI时,您可以将对象指定为Singleton生存期,可以是在应用程序启动时填充的配置类。作为一个单身人士,这似乎是一个很好的课程。

Singleton模式是一个强大的模式,但与所有设计模式一样,当以错误的方式使用时,它们可能弊大于利。 DI和避免使用Singleton也可以提高测试性。

暂时干杯,

安德鲁

答案 1 :(得分:3)

Singleton是一种模式。它经常出现在DI容器中或static API中。我假设你指的是static味道。

通过static成员公开的对象为消费者提供尽可能低的摩擦力;这就是他们如此吸引人的原因。依赖注入以不同的方式解决相同的问题(对象访问)。使用DI,依赖关系的生命周期是配置细节,而不是固有的事实。

以下是我的另一个解决这个问题的答案:

Dependency Injection & Singleton Design pattern

答案 2 :(得分:2)

只要有可能,我肯定会对单例对象使用依赖注入。即使你不太可能注入除了对象的一个​​特定实现之外的任何东西,使用注入也有很小的缺点,并且有很多潜在的好处。根据我的经验,依赖注入使得阅读代码的人更容易理解依赖关系,使代码更容易重构,提高可测试性,并且通常可以缩短构建时间。

那就是说,我已经遇到了理想情况下我会喜欢使用注入的代码,但是选择不这样做。以下是一些例子。

  • 我正在处理一个我无法轻易改变的API。
  • 我正在编写代码,如果我要求客户端注入他们不应该注意的东西,那么API看起来真的很奇怪。这对于一些静态实用程序库来说是正确的,比如解析字符串的函数,其中我有一个我不希望用户知道的辅助对象。我会尽力避免这种情况。
  • 我正在编写实验代码,我将要扔掉。在这种情况下,我会经常使用快捷方式来快速完成某些工作,并了解代码应该在以后删除或重构。

如果您尚未使用它们,则可能需要查看依赖项注入框架。我很高兴在Java代码中使用Google Guice