首页 文章

使用Unity的单例模式

提问于
浏览
1

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

    如果要阻止他们创建类,请将该类隐藏在远离用户的位置 .

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

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

    • 将它放在不同的程序集中并使其内部

    • 将它放在另一个类中并将其设为私有

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

  • 1

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

    public class Singleton {
     private Singleton instance = new Singleton();
    
     private Singleton() {}
    
     public Singleton getInstance() {
        return instance;
     }
    }
    

相关问题