使用 Unity 的单例模式
Posted
技术标签:
【中文标题】使用 Unity 的单例模式【英文标题】:Singleton pattern by using 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);
在两种情况下同时定义单例模式的最佳方法是什么(有和没有统一)?
【问题讨论】:
【参考方案1】:您只需要使用单例模式。 您可以在此处找到一个示例:Singleton Pattern
public class Singleton
private Singleton instance = new Singleton();
private Singleton()
public Singleton getInstance()
return instance;
【讨论】:
如果你想这样做,至少使用Lazy
...你必须使用static
,如果已经有一个DI容器,那将是相当奇怪的。
正如我之前所说,如果我这样做,我会失去依赖属性注入......我不想要它。【参考方案2】:
如果您想阻止用户创建该类,请将其隐藏起来。
这意味着为您的类创建一个公共接口,而该类本身不是公共的。无论如何,为您的服务提供一个接口是一个好主意,例如考虑单元测试......
对于服务实现的非公开性,我想到了几个选项:
将其放入不同的组件中,并将其置于内部 将其放在另一个类中并设为私有但请注意,恶意用户始终可以使用反射来创建自己的实例……没有 100% 的安全性。
【讨论】:
以上是关于使用 Unity 的单例模式的主要内容,如果未能解决你的问题,请参考以下文章