依赖注入 实时读取配置,包括但不限 以下格式
1. json 2. ini 3. xml 4 .config 5. 环境变量 6. 命令行 等
本文章 所有的 nuget包在 文章最底层 会详细说明用处
第一步:
1、以下面 json格式为示例进行演示
json格式为以下,命名为 config.json
{
"name": "清风扬",
"age": 18,
"address": {
"adr": "192.168.135.15",
"port": 80,
"hy": [
"192.168.1.101",
"192.168.1.102",
"192.168.1.103",
"192.168.1.104"
]
}
}
2 、配置出 json对应的C#实体类
namespace ConsoleApp1
{
public class MyConfig
{
public string Name { get; set; }
public string Age { get; set; }
public MyAddress Address { get; set; }
}
public class MyAddress
{
public string Adr { get; set; }
public string Port { get; set; }
public string[] Hy { get; set; }
}
}
3 、依赖注入 实现类
using Microsoft.Extensions.Options;
namespace ConsoleApp1
{
public class BuildOut
{
//这里的 MyConfig 是上面对应的 json实体设置的 MyConfig类
//记住IOptionsSnapshot 这个在于 某一范围外实时更新配置 下面代码会详细说明
private IOptionsSnapshot<MyConfig> _snapshot;
//这个是BuildOut构造函数 ,构造函数作为依赖注入
public BuildOut(IOptionsSnapshot<MyConfig> snapshot)
{
this._snapshot = snapshot;
}
//下面方法 用于 把所有 配置 打印出来
public void Test()
{
Console.WriteLine(_snapshot.Value.Name);
Console.WriteLine(_snapshot.Value.Age);
Console.WriteLine(_snapshot.Value.Address.Adr);
Console.WriteLine(_snapshot.Value.Address.Port);
if (_snapshot.Value.Address.Hy.Length > 0)
{
Console.WriteLine(_snapshot.Value.Address.Hy[0]);
Console.WriteLine(_snapshot.Value.Address.Hy[1]);
}
}
}
}
第二步
以上基本 工作 做完 就 可以 开始 写 代码了。
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
namespace ConsoleApp1
{
internal class Program
{
static void Main(string[] args)
{
ServiceCollection services = new ServiceCollection();
//下面这个对应添加范围的依赖注入项,<BuildOut>可以对应上面 第一步查找
services.AddScoped<BuildOut>();
ConfigurationBuilder builder = new ConfigurationBuilder();
//下面注释 掉的 可以任选一个 打开注释
//var root = builder.AddEnvironmentVariables().Build(); //这个是环境变变量配置
var root = builder.AddCommandLine(args).Build(); //这个是命令行配置
//下面是Json配置 config.json文件在程序根目录下
//var root = builder.AddJsonFile("config.json", optional: true, reloadOnChange: true).Build();
//添加配置项 <MyConfig>可以对应上面 第一步查找
services.AddOptions().Configure<MyConfig>(e=>root.Bind(e));
using (var sp = services.BuildServiceProvider())
{
using (IServiceScope scope = sp.CreateScope())
{
BuildOut build = scope.ServiceProvider.GetRequiredService<BuildOut>();
build.Test();
} //出了这个 using 修改配置立马 更新
}
}
}
}
上面mian 函数中 打开的是 命令行配置,但是注意下 传参!下面 把 第一步的json 做示例 演示下
ConsoleApp1.exe name=筱筱 age=28 address:adr=192.168.10.126 address:port=60 address:hy:0=192.168.0.1 address:hy:1=192.168.0.2 address:hy:2=192.168.0.3
这是 命令行参数转换为json 的扁平化处理
上面的扁平化 也适合 环境变量的方式
第三步
解释下 所 引用的包
Microsoft.Extensions.Configuration 必须的
Microsoft.Extensions.Configuration.Binder 必须的
Microsoft.Extensions.DependencyInjection 必须的
Microsoft.Extensions.Options 必须的
Microsoft.Extensions.Configuration.CommandLine 可选的,如果需要命令行 配置 安装这个
Microsoft.Extensions.Configuration.EnvironmentVariables 可选的,如果需要环境变量配置 安装这个
Microsoft.Extensions.Configuration.Json 可选的,如果需要 json配置 安装这个
Microsoft.Extensions.Configuration.Ini 可选的,如果需要 ini配置 安装这个