混合依赖注入与单例设计模式
Mixing Dependency Injection with the Singleton Design Pattern
我的项目中有一个单例,如下所示:
//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 包含其他几个 类 作为属性,这些属性永远不应该为 null。
通常我会使用 DependencyInjection 来保证每个新对象在实例化时获得所有必要的参数。
像这样:
IHelperClass Helper {get; set;}
IExectiveClass Executive {get; set;}
public NotMySingleton(IHelperclass helper, IExecutiveClass executive)
{
Helper = helper;
Executive = executive;
}
但我不知道如何将 DependencyInjection 与 Singleton Pattern.
结合起来
有没有办法通过 DependenyInjection 使用单例? 常见的做法是什么? 我有什么选择 (如果这不是一个合适的选项)?
所有 DI 框架都提供了一种方法来定义 DI 容器实例化的对象的生命周期。
一个生命周期作用域通常是 Singleton。
如果让 DI 框架控制 MySingleton
的生命周期,DI 将正常工作。
请注意,任何注入单例的 class 也将是单例,无论这些依赖项的范围是如何定义的。
如果您不能或不想使用 DI 框架来创建您的 MySingleton
实例,实现相同目的的一种方法是使 DI 容器可用并解析实例需要的任何内容DI容器,手动。
不过有些人可能认为这是一种反模式。
我的项目中有一个单例,如下所示:
//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 包含其他几个 类 作为属性,这些属性永远不应该为 null。
通常我会使用 DependencyInjection 来保证每个新对象在实例化时获得所有必要的参数。 像这样:
IHelperClass Helper {get; set;}
IExectiveClass Executive {get; set;}
public NotMySingleton(IHelperclass helper, IExecutiveClass executive)
{
Helper = helper;
Executive = executive;
}
但我不知道如何将 DependencyInjection 与 Singleton Pattern.
结合起来有没有办法通过 DependenyInjection 使用单例? 常见的做法是什么? 我有什么选择 (如果这不是一个合适的选项)?
所有 DI 框架都提供了一种方法来定义 DI 容器实例化的对象的生命周期。 一个生命周期作用域通常是 Singleton。
如果让 DI 框架控制 MySingleton
的生命周期,DI 将正常工作。
请注意,任何注入单例的 class 也将是单例,无论这些依赖项的范围是如何定义的。
如果您不能或不想使用 DI 框架来创建您的 MySingleton
实例,实现相同目的的一种方法是使 DI 容器可用并解析实例需要的任何内容DI容器,手动。
不过有些人可能认为这是一种反模式。