使用Unity的单例模式

时间:2017-03-30 08:38:30

标签: c# singleton unity-container

Unity允许使用:

创建单例
this.UnityContainer.RegisterType<MyClass>(new ContainerControlledLifetimeManager());
var instance = this.UnityContainer.Resolve<MyClass>();

对MyClass构造函数的访问必须是公共的,以允许容器能够创建一个新实例(对于另一个项目,如模块,......)。

在这种情况下,开发人员仍然可以直接使用构造函数创建新实例:

var instance = new MyClass();

如何阻止开发人员这样做?

另一种方法是创建一个实例(类的构造函数访问现在是私有的 - 单例模式)并将其注册为如下所示的单元,我丢失了依赖属性注入,我的解决方法是使用服务定位器来初始化静态方法中的依赖项属性实例:

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

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

2 个答案:

答案 0 :(得分:1)

如果您想阻止他们创建该课程,请远离您的用户。

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

对于服务实现的非公开性,我们会想到几个选项:

  • 将它放在不同的程序集中并使其内部
  • 将它放在另一个类中并将其设为私有

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

答案 1 :(得分:0)

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

public class Singleton {
 private Singleton instance = new Singleton();

 private Singleton() {}

 public Singleton getInstance() {
    return instance;
 }
}