设计模式-向单例类注入依赖关系的一种好方法是什么



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

public class Singleton {
    private ISomeDependency _dependency;
    private static final Singleton INSTANCE = new Singleton();
    private Singleton() {
    }
    public static Singleton getInstance() {
       return INSTANCE;
    }
    ...
}

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

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

该类的设计应该和其他类一样:

public class SomeService : ISomeService 
{
    private ISomeDependency _dependency;
    public ISomeService(ISomeDependency dependency)
    {
        _dependency = dependency;
    }
    // ISomeService members here
}

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

您可以使用依赖项注入容器(如Spring.Net、MSUnity等)来获取依赖项的具体类型。

public class Singleton {
private ISomeDependency _dependency = Container.Resolve<ISomeDependency>();
private static final Singleton INSTANCE = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
   return INSTANCE;
}
...
}

现在您可以在singleton之外进行控制了。

最新更新