懒,一般不写博文,工作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;
如果您有更好的意见与建议,欢迎指正。