• .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,内容如下:

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <!--应用自定义配置-->
     3 <AppSet>
     4   <!--调试开关。默认false-->
     5   <Debug>false</Debug>
     6   <!--每批次处理的数据记录数-->
     7   <BatchSize>20000</BatchSize>
     8   <!--服务名称-->
     9   <ServiceName>TestName</ServiceName>
    10   <!--缓存清理时间-->
    11   <CacheTime>2018-02-26 01:28:00</CacheTime>
    12   <!--要监控的用户ID列表-->
    13   <UserList>
    14     <!--要监控的用户ID列表-->
    15     <Int32>123</Int32>
    16     <!--要监控的用户ID列表-->
    17     <Int32>23</Int32>
    18     <!--要监控的用户ID列表-->
    19     <Int32>98</Int32>
    20     <!--要监控的用户ID列表-->
    21     <Int32>38</Int32>
    22   </UserList>
    23   <!--键值对-->
    24   <KvDemo>
    25     <Comparer />
    26     <Count>3</Count>
    27     <Keys>
    28       <Count>3</Count>
    29     </Keys>
    30     <Values>
    31       <Count>3</Count>
    32     </Values>
    33   </KvDemo>  
    34 </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

  • 相关阅读:
    mysqlEasyHelper(待完善)
    入门day2
    入门day1
    c# 多态的理解
    c# 简单任务控制
    c# 陌生的关键字
    从0来搭建超灵活的MVP商用框架<三>-------网络层加入RxJava、事件总线封装、Dagger2集成
    从0来搭建超灵活的MVP商用框架<二>-------APP基础配置、Okhttp+Retrofit封装
    从0来搭建超灵活的MVP商用框架<一>-------从MVC至MVP的转变、通用网络切换框架
    IOC注入框架设计<三>-------Android Studio插件开发来自动生成ButterKnife相关代码
  • 原文地址:https://www.cnblogs.com/asxinyu/p/dotnet_Opensource_Newlife_Config.html
Copyright © 2020-2023  润新知