C# · 12月 31, 2021

c# – 需要帮助避免使用Singleton

我不是单身人士的仇恨,但我知道他们被虐待,因此我想学习避免在不需要的时候使用它们.

我正在开发一个跨平台的应用程序(Windows XP / Vista / 7,Windows Mobile 6.x,Windows CE5,Windows CE6).作为这个过程的一部分,我将代码重新分解为单独的项目,以减少代码重复,从而有机会修复初始系统的错误.

一个简单的应用程序的一部分是简单的,它是一个配置文件管理器.该项目负责存储配置文件.它有一个Profile类,其中包含应用程序的所有部分使用的一些配置数据.它有一个ProfileManager类,其中包含Profiles. ProfileManager将在硬盘驱动器上将配置文件读取/保存为单独的XML文件,并允许应用程序检索并设置“活动”配置文件.简单.

在第一个内部构建中,GUI是反模式SmartGUI.这是一个没有MVC / MVP的WinForms实现,因为我们希望工作更快而不是精心设计.这导致ProfileManager是单例.这是从应用程序的任何地方,GUI可以访问活动的配置文件.

这意味着我可以直接在ProfileManager.Instance.ActiveProfile中根据需要检索系统的不同部分的配置.每个GUI还可以对配置文件进行更改,因此每个GUI都有一个保存按钮,所以他们都可以访问ProfileManager.Instance.SaveActiveProfile()方法.

我在这里使用单身人士看不出什么错,因为我看不出有什么错,但知道单身人士并不理想.有没有更好的办法应该处理?将ProfileManager的一个实例传递给每个Controller / Presenter?创建ProfileManager时,如果其他核心组件被创建,并且在配置文件更改时注册到事件.这个例子很简单,很可能是许多系统的共同特征,所以认为这是学习如何避免单身人士的好地方.

附:我不得不针对Compact Framework 3.5构建应用程序,它限制了可以使用的正常的.Net框架类.

解决方法 单身人士遭到谴责的原因之一是,他们经常作为全球,共同,有时是可变状态的容器.当您的应用程序确实需要访问全局共享状态时,单例是一个很好的抽象:您需要访问麦克风或音频播放的移动应用需要协调,因为例如只有一组扬声器.

在您的应用程序的情况下,您有一个单一的“活动”配置文件,应用程序的不同部分需要修改.我想你需要决定用户的个人资料是否真的适合这种抽象.鉴于配置文件的显示是磁盘上的单个XML文件,我认为具有单例格式是很好的.

我认为你应该使用依赖注入或工厂模式来获得一个配置文件管理器.您只需要为需要使用个人资料的课程编写单元测试来了解此需求;您希望能够在运行时传递程序创建的配置文件,否则您的代码将与某个磁盘上的某些XML文件具有紧密耦合的依赖关系.