使用反射管理类,动态读取配置文件及json数据

9 篇文章 0 订阅
2 篇文章 0 订阅

懒,一般不写博文,工作9年了,自己的笔记一大堆,博客没有几篇,昨日偶然登录,发现上一篇博文  应用程序并行配置不正确解决方案,竟然访问量过万,备受鼓舞,分享一下懒癌人士,读取配置文件及json文件的方法。

先看一下效果

如果是列表形式如:List<InterfaceSetInfo> 

  使用的时候就是   

          var allConfigs =  ConfigManager<List<InterfaceSetInfo>>.ConfigData;

如果直接保存的是单个对象如:BasicConfigs
            var basicConfig = ConfigManager<BasicConfigs>.ConfigData;

哈哈,方便快捷吧,现在来看看实现过程

 

一、首先,看配置文件,在config文件里的多个json文件路径配置项

二、json文件保存不同格式的数据

如 basicConfig.json

2.如DBConfig.json

三,配置文件及json对象管理使用类

1 说明

这里的泛型类是json里的对象的类型,是列表就传递列表类型,是单个对象就传递单个对象的类型,

如果是列表形式如:List<InterfaceSetInfo> 

  使用的时候就是   

          var allConfigs =  ConfigManager<List<InterfaceSetInfo>>.ConfigData;

如果直接保存的是单个对象如:BasicConfigs
            var basicConfig = ConfigManager<BasicConfigs>.ConfigData;

 

2 实现步骤及源码解析:

1)静态构造函数里,获取json文件的保存路径

 DataPath = Constanse.GetConfigPath<T>(); //这是根据动态参数T获取配置路径的方法,稍后上源码

2)根据获取到的数据存储地址读取json文件

 var jsonStr = FileHelper.ReadFile(DataPath);

3)读取文件后反序列化,变为实体对象

 ConfigData = JsonHelper.DeserializeJsonToObject<T>(jsonStr);

 /// <summary>
    /// 配置文件读取管理类
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class ConfigManager<T> where T : class, new()
    {
        /// <summary>
        /// json对应的实体对象
        /// </summary>
        public static T ConfigData;

        /// <summary>
        /// json保存地址
        /// </summary>
        public static string DataPath;
        static ConfigManager()
        {
            DataPath = Constanse.GetConfigPath<T>();
            RefreshRules();
        }

        /// <summary>
        /// 刷新获取数据
        /// </summary>
        public static void RefreshRules()
        {
            var jsonStr = FileHelper.ReadFile(DataPath);//读取json data
          
            if (!string.IsNullOrEmpty(jsonStr))
            {
               ConfigData = JsonHelper.DeserializeJsonToObject<T>(jsonStr);
            }
            if (ConfigData == null) ConfigData = new T();

        }

        /// <summary>
        /// 保存配置
        /// </summary>
        public static void SaveConfigs()
        {
            var json = JsonHelper.ToJson(ConfigData);
            FileHelper.WriteFile(DataPath, json);

        }
    }

四 、现在接着看一下动态获取文件的配置名称及json路径的获取

DataPath = Constanse.GetConfigPath<T>();

实现思路

1)建一个专门获取配置文件路径的Constanse管理类

2)配置需要读取的config文件里的Key值,这里我使用的枚举,枚举的项直接是配置文件里的Key值

3)遍历枚举的属性,将枚举的名称作为Key值,从AppSettings里取值,拼接json的实际地址

4)同样,建词典,一个枚举值,对应他的json文件路径

5)写通过json里的对象类型 获取json文件保存路径的方法GetConfigPath<T>()

6)条件语句,根据传递的类型参数的Name,返回对应的PathEnum值,当然这里也可以使用配置文件进行配置

博主这里的业务很简单,就没写这么标准

 public class Constanse
    {
       
       
        public static Dictionary<PathEnum, string> ConfigPaths;
       
        static Constanse()
        {
           
            ConfigPaths = new Dictionary<PathEnum, string>();
            var props = typeof(PathEnum).GetFields();
            foreach (var pro in props)
            {
                var name = pro.Name;
                if (name == "value__") continue;
                var path= Application.StartupPath + ConfigurationManager.AppSettings[name];
                ConfigPaths.Add((PathEnum)Enum.Parse(typeof(PathEnum), name), path);
            }
           
        }

        public static string GetConfigPath<T>()
        {
            var pathEnum = PathEnum.BasicConfigPath;
            var type = typeof(T);
            var name = typeof(T).Name;

            if (name == "BasicConfigs")
            {
                pathEnum = PathEnum.BasicConfigPath;
            }else if(name== "List`1")
            {
                if (type.FullName.Contains("DataBaseInfo"))
                {
                    pathEnum = PathEnum.DBLinkConfigPath;
                }else if (type.FullName.Contains("InterfaceSetInfo"))
                {
                    pathEnum = PathEnum.ViewInfoConfigPath;
                }
            }
           

            return ConfigPaths[pathEnum];
        }
    }

枚举值:

 public enum PathEnum
    {
        LogPath=0,

        /// <summary>
        /// 基础信息:数据库常用链接名称及需要导出的数据表列表
        /// </summary>
        BasicConfigPath,

        /// <summary>
        /// 客户配置:数据库链接
        /// </summary>
        DBLinkConfigPath,

        /// <summary>
        /// 客户配置:视图信息
        /// </summary>
       ViewInfoConfigPath,
    }

 

 

  啦啦啦,到此就结束了,看一下使用效果吧

使用的时候直接

  var allConfigs =  ConfigManager<List<InterfaceSetInfo>>.ConfigData;
    var basicConfig = ConfigManager<BasicConfigs>.ConfigData;
      var  dbLinks = ConfigManager<List<DataBaseInfo>>.ConfigData;

如果您有更好的意见与建议,欢迎指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值