【小玩意儿】使用C#的“贫血模型”快速配置组件QuickConfig

一个程序,免不了的一件事就是做运行时配置。.Net平台原生的配置就是使用App.config。但是这种方式配置起来并不十分的灵活,而且是文本文件,不适合存储一些较为敏感的信息。

园子中也有很多博主发表过关于“快速配置文件”的文章,使用的是“序列化”和“反序列化”相关的知识。但是,仅仅给出了一个简单的实现,并不能复用。由于我经常性的会遇到需要给软件加一个配置文件的问题,于是就花费了一点时间,制作了一个QuickConfig组件,分享给大家。如果代码什么的有不对的地方,欢迎大家指出。

先说说QuickConfig的特点:

  1. 基于贫血模型:如果你的程序已经有了配置文件,并且为这个配置做了一个实体类来方便管理,那么,如果要QuickConfig,您只需要做很少的变更即可。
  2. 实时更新配置:如果在软件运行时,您手动修改了配置文件,那么这个修改是会立即反映到程序中的。
  3. 默认配置支持:任何一项配置,都会有一个默认值,对吧?
  4. 配置文件容错:如果客户不小心把配置文件搞丢了,或者弄坏了,那么软件就不能运行了吗?No,No,No。软件可以基于默认配置继续运行。
  5. 配置操作方便:可以随时从文件中读取配置,或者把配置保存,或者重置为默认值。(调用相应的方法即可)。
  6. 自定义序列化方式:组件默认提供XML序列化,您可以自己定义序列化方式。比如Json。
  7. 配置加密支持:通过自定义序列化方式,可以对流加密,自然就可以对配置文件加密。
  8. 自定义配置文件文件名:配置文件保存在程序的运行目录,默认是一个以配置类全名为文件名的xml文件。您也可以自己定义文件名。

是不是有些心动了呢?下面就让我们从实例入手吧!

首先,创建一个配置实体,定义好属性后,在构造函数中,写入配置默认值:(记得加入Serializable特性)

AppConfig.cs
 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组件到项目中。所有的准备工作就完成了,接着就可以使用啦。怎么用呢?很简单。。。

Program.cs
 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)

JsonQuickConfigProvider.cs
 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特性,那么就会是这样:

AppConfig.cs
 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中的代码,让其可以不断的获取配置:

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

由于一些原因,文件中只有组件,没有例子,劳烦大家手敲吧。(*^__^*) 嘻嘻。喜欢的话,劳烦大家给个支持。谢谢~!

posted @ 2012-05-06 22:20  Soar、毅  阅读(2852)  评论(11编辑  收藏  举报