【问题标题】:Singleton pattern by using Unity使用 Unity 的单例模式
【发布时间】:2017-08-24 01:38:08
【问题描述】:

Unity 允许创建一个单例:

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

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

在这种情况下,开发者仍然可以直接使用构造函数来创建一个新的实例:

var instance = new MyClass();

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

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

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

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

【问题讨论】:

    标签: c# singleton unity-container


    【解决方案1】:

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

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

    【讨论】:

    • 如果你想这样做,至少使用Lazy...你必须使用static,如果已经有一个DI容器,那将是相当奇怪的。
    • 正如我之前所说,如果我这样做,我会失去依赖属性注入......我不想要它。
    【解决方案2】:

    如果您想阻止用户创建该类,请将其隐藏起来。

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

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

    • 将其放入不同的组件中,并将其置于内部
    • 将其放在另一个类中并设为私有

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多