使用 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 的单例模式的主要内容,如果未能解决你的问题,请参考以下文章

Unity 单例模式

Unity单例模式(普通单例和继承MonoBehaviour的单例)

Unity3D中的单例模式

单例模式

Unity单例模式最佳实践(附代码)

Unity游戏基本框架