开发技术上,微软走下坡路的一大原因,除了开源生态不够,还有一个很重要的原因,很多常用的功能,不能简单的代码实现,这是很多微软系程序猿头疼一件事。
比如,要想做个简单的 http server,需要很多代码,最后,性能跟IIS还相差十万八千里
比如,要搭个FTP,非要搞得很复杂,跟系统用户挂钩,不能简单的用户名、密码、目录
比如,要做个最简单的md5加密,还得好几行代码,还不是常见的写法,每次得去搜索
比如,得到一个时间戳,也是一样得好几行代码,敲很多文字
比如,读取数据库到对象,还要自己去实现 DataTableToEntityList
…………
太多了,最近在使用 net core 开发 控制台应用程序时,为了读取一个 json 配置文件,被折磨得不行了。。。。
网上的资源都是比较老的,读取时,无法解决错误:
IConfiguration builder = new ConfigurationBuilder()
这个简单的语句,怎么都是提示
错误 CS0246 未能找到类型或命名空间名“ConfigurationBuilder”(是否缺少 using 指令或程序集引用?)
我加了这些 Nuget 引用:
Microsoft.Extensions.Configuration
Microsoft.Extensions.Configuration.Json
Microsoft.Extensions.Configuration.EnvironmentVariables
Microsoft.Extensions.Configuration.FileExtensions
仍然没用,还是找不到!
真无语,这种常用的功能,居然要用微软自己的东西来实现这么麻烦,于是手动写了一个,而且增加了监控功能,当文件有修改时,自动读取新的配置。
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace CommProcess
{
/// <summary>
/// Json 配置读取类
/// </summary>
public class JsonConfig
{
private JObject JsonObj;
private readonly string JsonFilePath;
private readonly FileSystemWatcher JsonWatcher;
/// <summary>
/// Json 配置读取类
/// </summary>
/// <param name="JsonFilePath">Json 文件路径,绝对或相对路径</param>
/// <param name="MonitorChange">是否监视配置文件改动</param>
public JsonConfig(string JsonFilePath, bool MonitorChange = true)
{
this.JsonFilePath = JsonFilePath;
ReadFile();
if (MonitorChange)
{
if (JsonFilePath.IndexOf(':') != 1)
{
JsonFilePath = Path.Combine(Environment.CurrentDirectory, JsonFilePath);
}
JsonWatcher = new FileSystemWatcher();
JsonWatcher.Path = Path.GetDirectoryName(JsonFilePath);
JsonWatcher.Filter = Path.GetFileName(JsonFilePath);
JsonWatcher.EnableRaisingEvents = true;
JsonWatcher.Changed += JsonWatcher_Changed;
}
}
private void JsonWatcher_Changed(object sender, FileSystemEventArgs e)
{
Task.Run(() =>
{
Task.Delay(1000);
ReadFile();
});
}
private void ReadFile()
{
using var stream = File.Open(JsonFilePath, FileMode.Open, FileAccess.Read);
byte[] b = new byte[stream.Length];
stream.Read(b, 0, b.Length);
string json = Encoding.UTF8.GetString(b);
JsonObj = JObject.Parse(json);
}
/// <summary>
/// 获取配置值
/// </summary>
/// <typeparam name="T">数据类型</typeparam>
/// <param name="node">路径,比如:config.server</param>
/// <returns></returns>
public T? Get<T>(string node)
{
var jnode = JsonObj.SelectToken(node);
if (jnode == null) return default;
return jnode.Value<T>();
}
}
}
使用很简单,
var jconfig = new JsonConfig("jsconfig.json");
var name = jconfig.Get<string>("info.name");