【小玩意儿】使用C#的“贫血模型”快速配置组件QuickConfig
一个程序,免不了的一件事就是做运行时配置。.Net平台原生的配置就是使用App.config。但是这种方式配置起来并不十分的灵活,而且是文本文件,不适合存储一些较为敏感的信息。
园子中也有很多博主发表过关于“快速配置文件”的文章,使用的是“序列化”和“反序列化”相关的知识。但是,仅仅给出了一个简单的实现,并不能复用。由于我经常性的会遇到需要给软件加一个配置文件的问题,于是就花费了一点时间,制作了一个QuickConfig组件,分享给大家。如果代码什么的有不对的地方,欢迎大家指出。
先说说QuickConfig的特点:
- 基于贫血模型:如果你的程序已经有了配置文件,并且为这个配置做了一个实体类来方便管理,那么,如果要QuickConfig,您只需要做很少的变更即可。
- 实时更新配置:如果在软件运行时,您手动修改了配置文件,那么这个修改是会立即反映到程序中的。
- 默认配置支持:任何一项配置,都会有一个默认值,对吧?
- 配置文件容错:如果客户不小心把配置文件搞丢了,或者弄坏了,那么软件就不能运行了吗?No,No,No。软件可以基于默认配置继续运行。
- 配置操作方便:可以随时从文件中读取配置,或者把配置保存,或者重置为默认值。(调用相应的方法即可)。
- 自定义序列化方式:组件默认提供XML序列化,您可以自己定义序列化方式。比如Json。
- 配置加密支持:通过自定义序列化方式,可以对流加密,自然就可以对配置文件加密。
- 自定义配置文件文件名:配置文件保存在程序的运行目录,默认是一个以配置类全名为文件名的xml文件。您也可以自己定义文件名。
是不是有些心动了呢?下面就让我们从实例入手吧!
首先,创建一个配置实体,定义好属性后,在构造函数中,写入配置默认值:(记得加入Serializable特性)
1 [Serializable] 2 public class AppConfig 3 { 4 public AppConfig() 5 { 6 this.AppName = "Brain Burst"; 7 this.UpdateInterval = 1; 8 this.MainWindowSize = new Size(800, 600); 9 } 10 /// <summary> 11 /// 应用程序名称 12 /// </summary> 13 public String AppName { get; set; } 14 /// <summary> 15 /// 更新间隔 单位:小时 16 /// </summary> 17 public Int32 UpdateInterval { get; set; } 18 /// <summary> 19 /// 主窗体大小 20 /// </summary> 21 public Size MainWindowSize { get; set; } 22 }
引入QuickConfig组件到项目中。所有的准备工作就完成了,接着就可以使用啦。怎么用呢?很简单。。。
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 var cfm = QuickConfigManagement<AppConfig>.Create(); 6 Console.Write(cfm.ConfigModel.AppName); 7 Console.WriteLine(cfm.ConfigModel.MainWindowSize.ToString()); 8 Console.ReadLine(); 9 } 10 }
是不是真的很简单?简单到要爆掉?。。嘿嘿,还有更精彩的。我们可以使用QuickConfigArgumentAttribute特性来设置配置文件的文件名以及序列化方式。
首先,我们先做一个Json序列化的实现(实现IQuickConfigProvider接口):(引用Json.Net)
1 public class JsonQuickConfigProvider : QuickConfig.IQuickConfigProvider 2 { 3 public Type ConfigType { get; set; } 4 5 public object Deserialize(System.IO.Stream stream) 6 { 7 JsonSerializer js = new JsonSerializer(); 8 return js.Deserialize(new System.IO.StreamReader(stream), this.ConfigType); 9 } 10 11 public void Serialize(System.IO.Stream stream, object config) 12 { 13 JsonSerializer js = new JsonSerializer(); 14 var sw = new System.IO.StreamWriter(stream); 15 js.Serialize(sw, config); 16 sw.Flush(); 17 } 18 }
然后,给AppConfig类加入QuickConfigArgumentAttribute特性,那么就会是这样:
1 [Serializable] 2 [QuickConfigArgument("config.json",typeof(JsonQuickConfigProvider))] 3 public class AppConfig 4 { 5 public AppConfig() 6 { 7 this.AppName = "Brain Burst"; 8 this.UpdateInterval = 1; 9 this.MainWindowSize = new Size(800, 600); 10 } 11 /// <summary> 12 /// 应用程序名称 13 /// </summary> 14 public String AppName { get; set; } 15 /// <summary> 16 /// 更新间隔 单位:小时 17 /// </summary> 18 public Int32 UpdateInterval { get; set; } 19 /// <summary> 20 /// 主窗体大小 21 /// </summary> 22 public Size MainWindowSize { get; set; } 23 }
这样的话,运行程序,就会产生一个config.json的文件:
现在我们修改一下Program.cs中的代码,让其可以不断的获取配置:
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 var cfm = QuickConfigManagement<AppConfig>.Create(); 6 while (true) 7 { 8 Console.Write(cfm.ConfigModel.AppName); 9 Console.WriteLine(cfm.ConfigModel.MainWindowSize.ToString()); 10 var key = Console.ReadLine(); 11 if (String.Equals(key, "exit")) break; 12 } 13 } 14 }
接着,运行程序:
使用Notepad++打开config.json文件。修改其中的内容:
可以看到,我们将AppNamde的值,修改为Soar Brain Burst。现在,回到程序,按下回车后:
可以看到,程序读出的值已经刷新了。(我向你保证,不是每次访问配置实体的属性时都会重新读取一遍配置文件)
来试试“重新载入”和“恢复默认值”吧:
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 var cfm = QuickConfigManagement<AppConfig>.Create(); 6 Console.WriteLine(cfm.ConfigModel.AppName);//Soar Brain Burst 7 cfm.ConfigModel.AppName = "New App Name"; //设置新值 8 cfm.Load();//重新载入配置文件 9 Console.WriteLine(cfm.ConfigModel.AppName);//Soar Brain Burst 10 } 11 }
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 var cfm = QuickConfigManagement<AppConfig>.Create(); 6 Console.WriteLine(cfm.ConfigModel.AppName);//Soar Brain Burst 7 cfm.Reset();//配置设为默认值 8 Console.WriteLine(cfm.ConfigModel.AppName);//Brain Burst 9 /* 10 * 在调用Reset之后, 11 * 实体配置并不会被写入配置文件。 12 * 要想写入配置文件, 13 * 需要调用Save方法。 14 */ 15 cfm.Save(); 16 } 17 }
长出一口气。终于完成了。这是我第一次在博客园中分享自己写的组件,如果大家有什么意见,欢迎提出。QuickConfig的下载地址是:https://files.cnblogs.com/Soar1991/QuickConfig.7z
由于一些原因,文件中只有组件,没有例子,劳烦大家手敲吧。(*^__^*) 嘻嘻。喜欢的话,劳烦大家给个支持。谢谢~!