为单例类注入依赖项的好方法是什么?

Chr*_*ian 5 language-agnostic singleton design-patterns dependency-injection

我有一个依赖于另一个类的单例,所以我想注入这个依赖项,以使它可以单元测试.由于没有办法在单例上使用构造函数注入,我想我应该使用setter injcetion而不是我真的不喜欢它,因为在某些时候某人(可能是我自己)将忘记调用setter.您当然可以将依赖对象注入到单例的getInstance方法中,但这也非常难看.有没有更好的方法来解决这个问题(不使用像IoC容器这样的工具)?

public class Singleton {
    private ISomeDependency _dependency;
    private static final Singleton INSTANCE = new Singleton();
    private Singleton() {
    }
    public static Singleton getInstance() {
       return INSTANCE;
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*ven 3

单例设计模式是一个很大的反模式,因为无法在单例中注入依赖项。但这并不意味着在应用程序的生命周期内无法拥有单个实例,但您不应该为此使用单例设计模式。特别是在使用依赖注入时,没有理由使用这种设计模式。

只需将该类型的实例作为构造函数注入到依赖于它的类型中即可。这使您可以在应用程序顶部构建对象图并控制那里的生活方式并将依赖项注入到该实例中。

该类的设计应该与任何其他类一样:

public class SomeService : ISomeService 
{
    private ISomeDependency _dependency;

    public ISomeService(ISomeDependency dependency)
    {
        _dependency = dependency;
    }

    // ISomeService members here
}
Run Code Online (Sandbox Code Playgroud)

依赖注入框架将允许您非常轻松地定义任何类型的生活方式。然而,对于简单的应用程序,您仍然可以手动执行此操作。