C# 使用Unity的单例模式

C# 使用Unity的单例模式,c#,singleton,unity-container,C#,Singleton,Unity Container,Unity允许创建具有以下功能的单例: this.UnityContainer.RegisterType<MyClass>(new ContainerControlledLifetimeManager()); var instance = this.UnityContainer.Resolve<MyClass>(); 如何防止开发人员这样做 另一种方法是创建一个实例(类的构造函数访问是private now-singleton模式)并向unity注册它,如下所示,我丢失

Unity允许创建具有以下功能的单例:

this.UnityContainer.RegisterType<MyClass>(new ContainerControlledLifetimeManager());
var instance = this.UnityContainer.Resolve<MyClass>();
如何防止开发人员这样做

另一种方法是创建一个实例(类的构造函数访问是private now-singleton模式)并向unity注册它,如下所示,我丢失了依赖项属性注入,我的解决方法是使用服务定位器初始化静态方法实例中的依赖项属性:

this.UnityContainer.RegisterInstance<MyClass>(MyClass.Instance);
this.UnityContainer.RegisterInstance(MyClass.Instance);

在这两种情况下同时定义单例模式的最佳方法是什么(有统一和没有统一)?

如果您想阻止用户创建该类,请隐藏该类

这意味着为类创建公共接口,而类本身不是公共的。无论如何,为您的服务提供一个接口是一个好主意,想想单元测试,例如

考虑到您的服务实施的非公开性,您会想到几个选项:

  • 将其放在另一个组件中,并使其成为内部组件
  • 把它放在另一个班级,让它成为私人的

但是请注意,恶意用户总是可以使用反射来创建自己的实例。。。没有100%的安全性。

您只需使用单例模式。 您可以在此处找到一个示例:


如果你想这样做,至少使用
Lazy
。。。您必须使用
static
,如果已经有了DI容器,那将非常奇怪。。。我不想要它。
this.UnityContainer.RegisterInstance<MyClass>(MyClass.Instance);
public class Singleton {
 private Singleton instance = new Singleton();

 private Singleton() {}

 public Singleton getInstance() {
    return instance;
 }
}