记得 5 年前开始拼命翻读 X 组件的源码, 特别是 XCode, 但对 Newlife.Core 的东西了解很少, 最多只是会用用, 而且用到的只是九牛一毛里面好用的东西太多了
最近一年时间, 零零散散又学了很多, 也了解了很多, 不会写那总要学会用吧, 今天就给大家介绍里面非常好用的自定义配置文件用法
X 组件的介绍我就不多说了, 看这里多年前系列文章:
说明: 文章是多年前的, 但这些年变动也很大, 最好看看源码, 基本用法都还差不多
.NET 开源文章目录: 本博客. NET 开源项目文章目录
1. 关于配置文件
说道配置文件, 大家觉得太平凡和普通了, 有人说有 App.Config 本来就可以用, 何必搞这么多灰机
可是飞机类型也很多, 有空何必不尝试一下这个型号的飞机
实际上 App.Config 里面对自定义的配置不太适合, 加一堆, 多了看起来也难受而且有时候不同外部组件可能也带配置文件, 多了就分不清楚了
还有很多系统的配置可能需要及时生效 (在不需要重新启动的情况下), 以及程序中使用的简单, 灵活性, 也是一个重点
吹了这么多水, 那来看点实际的, 看看 Newlife.Core 里面的配置文件有啥新东东
2.Newlife.Core 的配置功能
我总结的这个配置文件最大的优点:
1. 开发过程中建立一个配置文件非常方便集成, 加属性, 加默认值, 如果有其他逻辑, 补充一下
2. 使用极其方便, 通过 XXX 类名. Current. 属性名 就可以直接对配置项进行读写
3. 修改及时生效, 可以设置生效时间, 这样很多情况下, 程序不用重启配置就能及时生效
4. 程序启动如果发现没有该配置项目, 会自动新建默认配置文件与 XCode 的反向工程异曲同工
5. 支持列表, 字典等复杂数据结构
6. 代码注释和 XML 文件的注释匹配
下面看看使用 Demo:
3.Newlife.Core 的配置的玩法
3.1 新建配置文件类
来个案例: 加上要给一个应用程序加一个增加一个自定义配置文件:
配置项有 (纯属虚构, 不要纠结):
Debug(是否调试模式)
BatchSize(每批次处理的数据记录数),
ServiceName(服务名称)
CacheTime(缓存清理时间)
UserList(要监控的用户列表)
KvDemo(键值对)
首先, 新建一个配置类: AppSet, 代码如下 (一般就是复制一份):
- /// <summary > 应用自定义配置 </summary>
- [Description("应用自定义配置")]
- [XmlConfigFile("Config/AppSet.config", 3000)]
- public class AppSet : XmlConfig
- {
- /// <summary > 调试开关默认 false</summary>
- [Description("调试开关默认 false")]
- public Boolean Debug { get; set; } = false;
- /// <summary > 每批次处理的数据记录数 </summary>
- [Description("每批次处理的数据记录数")]
- public Int32 BatchSize { get; set; } = 20000;
- /// <summary > 服务名称 </summary>
- [Description("服务名称")]
- public String ServiceName { get; set; } = "AppServer";
- /// <summary > 缓存清理时间 </summary>
- [Description("服务数据处理的线程数, 32")]
- public DateTime CacheTime { get; set; } = DateTime.Now.AddHours(5);
- /// <summary > 要监控的用户 ID 列表 </summary>
- [Description("要监控的用户 ID 列表")]
- public List UserList { get; set; } = new List() { 123,23,98,38};
- /// <summary > 键值对 </summary>
- [Description("键值对")]
- public Dictionary<Int32, string> KvDemo { get; set; } =
- new Dictionary<int, string>(){ { 1,"aaa"},{2,"bbb"},{ 3,"ccc"} };
- }
配置文件说明:
1. 类的特性: Description 是整个 XML 配置文件的注释, XmlConfigFile 定义文件位置和名称, 以及生效时间 3000ms
2. 属性中的 Description 特性也是对该属性的说明 (都会写入配置文件), 至于注释大家都知道, 智能提示有用
3. 对属性的赋值是配置的默认值, 程序启动第一次使用该类, 如果配置文件不存在, 就会自动采用这里的值创建, 否则以存在的文件值为准
4. 程序中可以动态修改和保存配置
3.2 配置文件使用
每个配置文件都有一个静态的 Current 属性, 通过静态对象来对整个配置文件进行操作例如
- var name = AppSet.Current.ServiceName ;// 读取配置
- AppSet.Current.ServiceName = "TestName";// 设置配置
- AppSet.Current.Save();// 配置保存, 有异步方法, 程序中动态进行
如果程序第一次使用该配置类, 在 bin 目录的 Config 文件夹, 就会生成一个名称为 AppSet.config 的配置文件如下图:
由于 Newlife 本身也有一些配置类, 所以也会自动生成在该目录, 习惯都放在一起, 也可以通过类特性修改保存路径打开 AppSet.config, 内容如下:
- <?xml version="1.0" encoding="utf-8"?>
- <!-- 应用自定义配置 -->
- <AppSet>
- <!-- 调试开关默认 false-->
- <Debug>false</Debug>
- <!-- 每批次处理的数据记录数 -->
- <BatchSize>20000</BatchSize>
- <!-- 服务名称 -->
- <ServiceName>TestName</ServiceName>
- <!-- 缓存清理时间 -->
- <CacheTime>2018-02-26 01:28:00</CacheTime>
- <!-- 要监控的用户 ID 列表 -->
- <UserList>
- <!-- 要监控的用户 ID 列表 -->
- <Int32>123</Int32>
- <!-- 要监控的用户 ID 列表 -->
- <Int32>23</Int32>
- <!-- 要监控的用户 ID 列表 -->
- <Int32>98</Int32>
- <!-- 要监控的用户 ID 列表 -->
- <Int32>38</Int32>
- </UserList>
- <!-- 键值对 -->
- <KvDemo>
- <Comparer />
- <Count>3</Count>
- <Keys>
- <Count>3</Count>
- </Keys>
- <Values>
- <Count>3</Count>
- </Values>
- </KvDemo>
- </AppSet>
仔细对照上面类的设置, 一目了然所以做一个这样的配置分分钟的事情这里字典也支持, 其实还支持类对象, 可以把所有属性都给配置进行
就不一一演示了, 下面我们看看配置如何动态生效
3.3 配置动态生效
下面, 我们来做一个小实验, 程序启动后, 间隔 7s 来读取一次配置文件 (配置文件 3000 毫秒检测一次变化), 然后手动到目录下去修改配置文件中的值,
代码如下:
- XTrace.UseConsole();
- while(true)
- {
- XTrace.WriteLine(AppSet.Current.ServiceName);
- // 休眠 7000 毫秒, 重新获取
- System.Threading.Thread.Sleep(7000);
- }
结果如下:
可以看到配置的服务名称修改后, 日志打印出有更新, 重新加载, 并继续打印出修改后的值
4. 底层源码实现
配置文件泛型基类源代码位置在 NewLife.Core/Xml/XmlConfig.cs , 对泛型的使用很常见, 但对泛型基类使用出神入化, 我见到最多的就是在 X 组件里面非常牛逼的一个东西, 我只会其皮毛, 作者 @大石头才是码神
由于该配置文件基于 XML 文件, 所以有几个辅助类核新的代码主要是加载, 和保存等逻辑, 和上面功能一直, 如果想学习, 建议代码 down 下来, 调试一遍
5. 相关资源
Newlife 组件地址: https://github.com/NewLifeX/X
本文演示代码地址: https://github.com/asxinyu/NewlifeDemo
来源: https://www.cnblogs.com/asxinyu/p/dotnet_Opensource_Newlife_Config.html