.NET平台开源项目速览(20)Newlife.Core中简单灵活的配置文件
如果用知乎,可以关注专栏:.NET开源项目
记得5年前开始拼命翻读X组件的源码,特别是XCode,但对Newlife.Core 的东西了解很少,最多只是会用用,而且用到的只是九牛一毛。里面好用的东西太多了。
最近一年时间,零零散散又学了很多,也了解了很多,不会写那总要学会用吧,今天就给大家介绍里面非常好用的自定义配置文件用法。
X组件的介绍我就不多说了,看这里多年前系列文章:
说明:文章是多年前的,但这些年变动也很大,最好看看源码,基本用法都还差不多。
.NET开源文章目录:本博客.NET开源项目文章目录
本文原文地址:.NET平台开源项目速览(20)Newlife.Core中简单灵活的配置文件
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
.NET平台开源项目速览(20)Newlife.Core中简单灵活的配置文件的更多相关文章
- .NET平台开源项目速览(1)SharpConfig配置文件读写组件
在.NET平台日常开发中,读取配置文件是一个很常见的需求.以前都是使用System.Configuration.ConfigurationSettings来操作,这个说实话,搞起来比较费劲.不知道大家 ...
- .NET平台开源项目速览(9)软件序列号生成组件SoftwareProtector介绍与使用
在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了一下Software Protector序列号生成组件.今天就通过一篇简单的文章来预览一下其强大的功 ...
- .NET平台开源项目速览(8)Expression Evaluator表达式计算组件使用
在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了一下Expression Evaluator验证组件.那里只是概述了一下,并没有对其使用和强大功能做 ...
- .NET平台开源项目速览(7)关于NoSQL数据库LiteDB的分页查询解决过程
在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑) 与 .NET平台开源项目速览(3)小巧轻量级NoSQL文件数据库LiteDB中,介绍了LiteDB的基本使用情况以及部 ...
- .NET平台开源项目速览(21)Cron任务调度CronNET
如果用知乎,可以关注专栏:.NET开源项目和PowerBI社区 Quartznet大名鼎鼎应该很少有人不知道,相关的开源项目很多,不过那东东对新手来说,有点晦涩,加上哪个Cron表达式,可能一进去云里 ...
- .NET平台开源项目速览(17)FluentConsole让你的控制台酷起来
从该系列的第一篇文章 .NET平台开源项目速览(1)SharpConfig配置文件读写组件 开始,不知不觉已经到第17篇了.每一次我们都是介绍一个小巧甚至微不足道的.NET平台的开源软件,或者学习,或 ...
- .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...
- .NET平台开源项目速览(13)机器学习组件Accord.NET框架功能介绍
Accord.NET Framework是在AForge.NET项目的基础上封装和进一步开发而来.因为AForge.NET更注重与一些底层和广度,而Accord.NET Framework更注重与机器 ...
- .NET平台开源项目速览(12)哈希算法集合类库HashLib
.NET的System.Security.Cryptography命名空间本身是提供加密服务,散列函数,对称与非对称加密算法等功能.实际上,大部分情况下已经满足了需求,而且.NET实现的都是目前国际上 ...
随机推荐
- ASPNET5 依赖注入(Dependency Injection)
依赖注入一直是asp.net web框架(Web API,SignalR and MVC)中不可或缺的一部分,但是在以前,这个框架都是各自升级,都有各自的依赖注入实现方式,即使Katana项目想通过O ...
- 国家语言,语言代码,locale id对应表
国家语言,语言代码,locale id对应表.比如 en_US对应的id为1033, 中文的locale=zh_CN,id=2052. Locale Languagecode LCIDstring L ...
- Curl是什么,原文地址:http://www.phpchina.com/portal.php?mod=view&aid=40161
Curl是什么PHP supports libcurl, a library created by Daniel Stenberg, that allows you to connect and co ...
- 前端之基础css
一.anchor伪类,用于阅读文章. a:link(没有接触过的链接),用于链接常规状态 (末访问的链接)a:hover(鼠标放在链接上的状态) 用于产生视觉效果(已访问的链接)a:visited(访 ...
- 一个简单的node.js服务
var http = require('http'); var qs = require('querystring'); var server = http.createServer(function ...
- CentOS的软件包的管理之rpm和yum
在linux上,一个软件包通常由二进制程序,库文件,配置文件和帮助文件组成. 其中: 二进制程序一般都放在/bin,/sbin,/usr/bin,/usr/sbin,/usr/local/bin和/u ...
- 洛谷 [P2765] 魔术球问题
贪心做法 每次尽可能选择已经放过球的柱子 #include <iostream> #include <cstdio> #include <cstring> #inc ...
- bzoj 4033: [HAOI2015]树上染色 [树形DP]
4033: [HAOI2015]树上染色 我写的可是\(O(n^2)\)的树形背包! 注意j倒着枚举,而k要正着枚举,因为k可能从0开始,会使用自己更新一次 #include <iostream ...
- 洛谷 P3672 小清新签到题 [DP 排列]
传送门 题意:给定自然数n.k.x,你要求出第k小的长度为n的逆序对对数为x的1~n的排列 $n \le 300, k \le 10^13$ 一下子想到hzc讲过的DP 从小到大插入,后插入不会对前插 ...
- 如何使用JS实现banner图滚动
通过JS实现banner图的滚动主要是定时器的应用 先新建好banner图的几张图片,最后一张与第一张用同一个,保证滚动的不间断 改好样式,需注意所有图片要在同行显示,否则不能向左滚动 声明一个函数, ...