懒,一般不写博文,工作9年了,自己的笔记一大堆,博客没有几篇,昨日偶然登录,发现上一篇博文 应用程序并行配置不正确解决方案,竟然访问量过万,备受鼓舞,分享一下懒癌人士,读取配置文件及json文件的方法。
先看一下效果
如果是列表形式如:List
使用的时候就是
var allConfigs = ConfigManager>.ConfigData;
如果直接保存的是单个对象如:BasicConfigs
var basicConfig = ConfigManager
哈哈,方便快捷吧,现在来看看实现过程
如 basicConfig.json
2.如DBConfig.json
这里的泛型类是json里的对象的类型,是列表就传递列表类型,是单个对象就传递单个对象的类型,
如果是列表形式如:List
使用的时候就是
var allConfigs = ConfigManager>.ConfigData;
如果直接保存的是单个对象如:BasicConfigs
var basicConfig = ConfigManager
1)静态构造函数里,获取json文件的保存路径
DataPath = Constanse.GetConfigPath
2)根据获取到的数据存储地址读取json文件
var jsonStr = FileHelper.ReadFile(DataPath);
3)读取文件后反序列化,变为实体对象
ConfigData = JsonHelper.DeserializeJsonToObject
///
/// 配置文件读取管理类
///
///
public class ConfigManager where T : class, new()
{
///
/// json对应的实体对象
///
public static T ConfigData;
///
/// json保存地址
///
public static string DataPath;
static ConfigManager()
{
DataPath = Constanse.GetConfigPath();
RefreshRules();
}
///
/// 刷新获取数据
///
public static void RefreshRules()
{
var jsonStr = FileHelper.ReadFile(DataPath);//读取json data
if (!string.IsNullOrEmpty(jsonStr))
{
ConfigData = JsonHelper.DeserializeJsonToObject(jsonStr);
}
if (ConfigData == null) ConfigData = new T();
}
///
/// 保存配置
///
public static void SaveConfigs()
{
var json = JsonHelper.ToJson(ConfigData);
FileHelper.WriteFile(DataPath, json);
}
}
DataPath = Constanse.GetConfigPath
实现思路
1)建一个专门获取配置文件路径的Constanse管理类
2)配置需要读取的config文件里的Key值,这里我使用的枚举,枚举的项直接是配置文件里的Key值
3)遍历枚举的属性,将枚举的名称作为Key值,从AppSettings里取值,拼接json的实际地址
4)同样,建词典,一个枚举值,对应他的json文件路径
5)写通过json里的对象类型 获取json文件保存路径的方法GetConfigPath
6)条件语句,根据传递的类型参数的Name,返回对应的PathEnum值,当然这里也可以使用配置文件进行配置
博主这里的业务很简单,就没写这么标准
public class Constanse
{
public static Dictionary ConfigPaths;
static Constanse()
{
ConfigPaths = new Dictionary();
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()
{
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,
///
/// 基础信息:数据库常用链接名称及需要导出的数据表列表
///
BasicConfigPath,
///
/// 客户配置:数据库链接
///
DBLinkConfigPath,
///
/// 客户配置:视图信息
///
ViewInfoConfigPath,
}
啦啦啦,到此就结束了,看一下使用效果吧
使用的时候直接
var allConfigs = ConfigManager>.ConfigData;
var basicConfig = ConfigManager
var dbLinks = ConfigManager>.ConfigData;
如果您有更好的意见与建议,欢迎指正。