基于.NET Core的跨平台开发,配置文件与之前.NET Framework采用xml的config文件不同,目前主要是采用json文件键值对配置方式读取。

参考网上相关资料总结如下:

一、引入扩展 System.Configuration.ConfigurationManager

Nuget 下载扩展,Install-Package System.Configuration.ConfigurationManager

使用方式:添加配置文件App.config。读取方式与原.NET Framework方式一致

优点:兼容.NET Framework 原有配置方式

缺点:项目运行过程中若需修改App.config文件,对项目中输出的内容没有丝毫影响,Debug发现获取到的值的确没有变化,需要重新编译才生效。

二、引入扩展 Microsoft.Extensions.Options.ConfigurationExtensions

Nuget 下载扩展,

Install-Package Microsoft.Extensions.Options.ConfigurationExtensions

Install-Package Microsoft.Extensions.Configuration.FileExtensions

Install-Package Microsoft.Extensions.Configuration.Json

使用方式:参考微软官网:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/configuration/index?view=aspnetcore-2.1&tabs=basicconfiguration

优点:可以读取application.json中的配置参数,不再使用XML可以说很好的贴近Core的设计理念

缺点:运行时修改json文件读取到的内容不会改变,但是至少重启项目可以修改,若要运行时候修改json文件监听实现监听变化。查看源码,可以发现 虽然配置信息是通过AddSingleton注入的
但同时也注入了IOptionsChangeTokenSource ,故只需要在获取配置信息时将IOptions<> 替换为 IOptionsMonitor<>(通过监听的Option来获取信息),并通过 IOptionsMonitor<>.CurrentValue获取即可实时获取到最新的配置信息(存在修改监听)

另外就是,这个方法采用的是反序列化的原理,也就是必须有一个跟配置文件对应的实体类才可以,这个感觉比较鸡肋,放弃。

三、自定义扩展方法,这个实现自己写,原理是监听文件是否变更,来刷新Configuration 配置实现。

参考园友一个实现,具体需要是否有效,要花时间实践一下,原链接地址:http://www.cnblogs.com/kasimlz/p/7515810.html,代码如下:

public class ConfigurationManager
{
/// <summary>
/// 配置内容
/// </summary>
private static NameValueCollection _configurationCollection = new NameValueCollection(); /// <summary>
/// 配置监听响应链堆栈
/// </summary>
private static Stack<KeyValuePair<string, FileSystemWatcher>> FileListeners = new Stack<KeyValuePair<string, FileSystemWatcher>>(); /// <summary>
/// 默认路径
/// </summary>
private static string _defaultPath = Directory.GetCurrentDirectory() + "\\appsettings.json"; /// <summary>
/// 最终配置文件路径
/// </summary>
private static string _configPath = null; /// <summary>
/// 配置节点关键字
/// </summary>
private static string _configSection = "AppSettings"; /// <summary>
/// 配置外连接的后缀
/// </summary>
private static string _configUrlPostfix = "Url"; /// <summary>
/// 最终修改时间戳
/// </summary>
private static long _timeStamp = 0L; /// <summary>
/// 配置外链关键词,例如:AppSettings.Url
/// </summary>
private static string _configUrlSection { get { return _configSection + "." + _configUrlPostfix; } } static ConfigurationManager()
{
ConfigFinder(_defaultPath);
} /// <summary>
/// 确定配置文件路径
/// </summary>
private static void ConfigFinder(string Path)
{
_configPath = Path;
JObject config_json = new JObject();
while (config_json != null)
{
config_json = null;
FileInfo config_info = new FileInfo(_configPath);
if (!config_info.Exists) break; FileListeners.Push(CreateListener(config_info));
config_json = LoadJsonFile(_configPath);
if (config_json[_configUrlSection] != null)
_configPath = config_json[_configUrlSection].ToString();
else break;
} if (config_json == null || config_json[_configSection] == null) return; LoadConfiguration();
} /// <summary>
/// 读取配置文件内容
/// </summary>
private static void LoadConfiguration()
{
FileInfo config = new FileInfo(_configPath);
var configColltion = new NameValueCollection();
JObject config_object = LoadJsonFile(_configPath);
if (config_object == null || !(config_object is JObject)) return; if (config_object[_configSection]!=null)
{
foreach (JProperty prop in config_object[_configSection])
{
configColltion[prop.Name] = prop.Value.ToString();
}
} _configurationCollection = configColltion;
} /// <summary>
/// 解析Json文件
/// </summary>
/// <param name="FilePath">文件路径</param>
/// <returns></returns>
private static JObject LoadJsonFile(string FilePath)
{
JObject config_object = null;
try
{
StreamReader sr = new StreamReader(FilePath, Encoding.Default);
config_object = JObject.Parse(sr.ReadToEnd());
sr.Close();
}
catch { }
return config_object;
} /// <summary>
/// 添加监听树节点
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
private static KeyValuePair<string, FileSystemWatcher> CreateListener(FileInfo info)
{ FileSystemWatcher watcher = new FileSystemWatcher();
watcher.BeginInit();
watcher.Path = info.DirectoryName;
watcher.Filter = info.Name;
watcher.IncludeSubdirectories = false;
watcher.EnableRaisingEvents = true;
watcher.NotifyFilter = NotifyFilters.Attributes | NotifyFilters.CreationTime | NotifyFilters.DirectoryName | NotifyFilters.FileName | NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.Size;
watcher.Changed += new FileSystemEventHandler(ConfigChangeListener);
watcher.EndInit(); return new KeyValuePair<string, FileSystemWatcher>(info.FullName, watcher); } private static void ConfigChangeListener(object sender, FileSystemEventArgs e)
{
long time = TimeStamp();
lock (FileListeners)
{
if (time > _timeStamp)
{
_timeStamp = time;
if (e.FullPath != _configPath || e.FullPath == _defaultPath)
{
while (FileListeners.Count > )
{
var listener = FileListeners.Pop();
listener.Value.Dispose();
if (listener.Key == e.FullPath) break;
}
ConfigFinder(e.FullPath);
}
else
{
LoadConfiguration();
}
}
}
} private static long TimeStamp()
{
return (long)((DateTime.UtcNow - new DateTime(, , , , , , DateTimeKind.Utc)).TotalMilliseconds * );
} private static string c_configSection = null;
public static string ConfigSection
{
get { return _configSection; }
set { c_configSection = value; }
} private static string c_configUrlPostfix = null;
public static string ConfigUrlPostfix
{
get { return _configUrlPostfix; }
set { c_configUrlPostfix = value; }
} private static string c_defaultPath = null;
public static string DefaultPath
{
get { return _defaultPath; }
set { c_defaultPath = value; }
} public static NameValueCollection AppSettings
{
get { return _configurationCollection; }
} /// <summary>
/// 手动刷新配置,修改配置后,请手动调用此方法,以便更新配置参数
/// </summary>
public static void RefreshConfiguration()
{
lock (FileListeners)
{
//修改配置
if (c_configSection != null) { _configSection = c_configSection; c_configSection = null; }
if (c_configUrlPostfix != null) { _configUrlPostfix = c_configUrlPostfix; c_configUrlPostfix = null; }
if (c_defaultPath != null) { _defaultPath = c_defaultPath; c_defaultPath = null; }
//释放掉全部监听响应链
while (FileListeners.Count > )
FileListeners.Pop().Value.Dispose();
ConfigFinder(_defaultPath);
}
} }

.NET Core 读取配置文件方式总结的更多相关文章

  1. Core 读取配置文件

    新建控制台 static void Main(string[] args) { Console.WriteLine("Hello World!"); //获取应用程序的当前工作目录 ...

  2. .net core 读取配置文件的值

    .net core中的配置文件可以存一些自定义的值,我们需要去读取 在配置中添加json: "name": "sealee", "Connection ...

  3. ASP .NET CORE 读取配置文件的方法

    老式的config文件在ASP.net core2.0中变成了appsettings.json,如果想要读取自定义配置,可以写如下代码 { "Logging": { "I ...

  4. .net core 读取配置文件

    /// <summary> /// 读取配置信息 /// </summary> public class Zconfig { #region 读取配置信息 /// <su ...

  5. .Net Core 读取配置文件 appsettings.json

    1. 首先些一个类 public class MySettings { public string P1 { get; set; } public string P2 { get; set; } } ...

  6. Asp.net Core 和类库读取配置文件信息

    Asp.net Core 和类库读取配置文件信息 看干货请移步至.net core 读取配置文件公共类 首先开一个脑洞,Asp.net core 被使用这么长时间了,但是关于配置文件(json)的读取 ...

  7. .net core 学习 读取配置文件

    在空项目中是没有配置文件的,首先要新建一个,配置文件内容如下,下面来读取各个内容 { "ConnectionStrings": { "DefaultConnection& ...

  8. 【转】spring boot mybatis 读取配置文件

    spring boot mybatis 配置整理 一.加载mybatis的配置 1.手写配置,写死在代码里 import java.io.IOException; import java.util.P ...

  9. .net core 读取appsettings.json乱码

    .net core 读取配置文件乱码:vs2019读取appsettings.json乱码问题; .net core 读取appsettings.json乱码问题;用notepad++或者其他编辑器打 ...

随机推荐

  1. linux常用命令二

    linux常用命令一 常用指令 ls        显示文件或目录 -l           列出文件详细信息l(list) -a          列出当前目录下所有文件及目录,包括隐藏的a(all ...

  2. Ajax请求纯文本问题

    今天在学习Ajax时遇到一个问题: Ajax有个open(method String,url,boolean)方法,此方法有三个参数: 参数一:提交数据的请求,有GET和POST请求 GET:获取数据 ...

  3. Unity3D_05_理解Unity的新GUI系统(UGUI)

    理解Unity的新GUI系统(UGUI) Unity GUI 链接:UnityEngine.UI系统基础类架构图  Unity GUI 链接:UnityEngine Event & Event ...

  4. Redis常用命令(Set、Hash、Zset)

    1.Set(单值多value) 1. sadd.smembers key . > SADD set01 (integer) > SMEMBERS set01 ) " ) &quo ...

  5. Python中使用pip安装库时提示:远程主机强迫关闭了一个现有的连接

    场景 在cmd中使用pip install moviepy时,需要安装一些依赖库,很长时间后提示: 远程主机中断了一个现有的连接. 原因是默认镜像源下载过慢,将其修改为国内或者设置安装时的源. 这里以 ...

  6. Hbase 统计表行数的3种方式总结

    有些时候需要我们去统计某一个Hbase表的行数,由于hbase本身不支持SQL语言,只能通过其他方式实现.可以通过一下几种方式实现hbase表的行数统计工作: 1.count命令 最直接的方式是在hb ...

  7. Visual Studio Code安装Python环境

    如何在全宇宙最强编辑器安装Python运行环境 (雾 首先安装Python2和Python3,如果只需要用到一个的话,直接安装即可运行,不存在转换问题. 安装Python扩展,直接搜索安装即可. 更改 ...

  8. Python获取列表中的最后一个或者倒数第几个的方案

    print(members[3]) 灵魂所在“ - (负号 )” 我们先来创建一个列表,和php中的数组一样. members = ['张三','李四','王五','芳芳','小明','小王'] 按照 ...

  9. 31 (OC)* 内存管理

    31 (OC)  内存管理 一:内存管理黄金法则. 如果对一个对象使用了alloc.[Mutable]copy,retain,那么你必须使用相应的realease或者autorelease 二:内存管 ...

  10. 02 (OC)* ViewController 的声明周期

    一. UIViewController 的 生命周期 代码 示例 #pragma mark --- life circle // 非storyBoard(xib或非xib)都走这个方法 - (inst ...