我的项目中有一个Singleton,看起来像这样。
//Create a Singleton
static MySingleton Instance;
private static readonly object Padlock = new object();
/// <summary>
/// Singelton Method, to make sure only one instance of this class exists at runtime.
/// </summary>
/// <returns></returns>
public static MySingleton GetInstance()
{
//Thread Safety
lock (Padlock)
{
if (Instance == null)
{
Instance = new MySingleton();
}
return Instance;
}
}
private MySingleton()
{
}
//[...]
这个Singleton包含了其他几个类的属性,这些属性绝对不应该是空的。
通常我会使用 依赖注入 来保证每个新对象在实例化时得到所有必要的参数。
IHelperClass Helper {get; set;}
IExectiveClass Executive {get; set;}
public NotMySingleton(IHelperclass helper, IExecutiveClass executive)
{
Helper = helper;
Executive = executive;
}
但我不知道如何结合 依赖注入 附带 单人模式.
有什么方法可以用DependenyInjection来使用Singleons? 常见的做法是什么? 我有什么其他选择? (如果这不是一个合适的选择)?
所有的DI框架都提供了一种方法来定义DI容器实例化的对象的寿命.一个寿命范围通常是Singleton。
如果你让DI框架来控制你的对象的寿命,那么你就可以让DI框架来控制你的对象的寿命。MySingleton
,DI就可以了。
但有一点需要注意,任何被注入到单体的类也将是一个单体,无论这些依赖的范围是如何定义的。
如果你不能或不想使用DI框架来创建你的 MySingleton
实例,实现同样目的的一种方法是让DI容器可用,然后手动从DI容器中解析实例所需要的任何东西。不过有人可能会认为这是一种反模式。