安装相关包
Microsoft.Extensions.Configuration
Microsoft.Extensions.Configuration.JSON
创建json 配置文件
方式一
加载配置
using Microsoft.Extensions.Configuration;
namespace Config
{
public class Class1
{
static void Main(string[] args)
{
ConfigurationBuilder configuration = new ConfigurationBuilder();
configuration.AddJsonFile(
"config.json",
optional:true ,
reloadOnChange:true
);
IConfigurationRoot configurationRoot = configuration.Build();
string name = configurationRoot["name"];
Console.WriteLine($"name={name}");
string addr = configurationRoot.GetSection("proxy:address").Value;
Console.WriteLine($"addr={addr}");
}
}
}
控制台展示
方式二
下载依赖
Microsoft.Extensions.Configuration.Binder
修改json配置
{
"name": "zhangsan",
"age": "33",
"proxy": {
"address": "南京一区",
"port": "80"
}
}
测试
一、修改测试类
using Microsoft.Extensions.Configuration;
namespace Config
{
public class Class1
{
static void Main(string[] args)
{
ConfigurationBuilder configuration = new ConfigurationBuilder();
configuration.AddJsonFile(
"config.json",
optional: true,
reloadOnChange: true
);
IConfigurationRoot configurationRoot = configuration.Build();
/* string name = configurationRoot["name"];
Console.WriteLine($"name={name}");
string addr = configurationRoot.GetSection("proxy:address").Value;
Console.WriteLine($"addr={addr}");*/
Proxy proxy = configurationRoot.GetSection("proxy").Get<Proxy>();
Console.WriteLine($"{proxy.Address},{proxy.port}");
}
class Proxy
{
public string Address { get; set; }
public int port { get;set; }
}
}
}
控制台展示
二、修改测试类
using Microsoft.Extensions.Configuration;
namespace Config
{
public class Class1
{
static void Main(string[] args)
{
ConfigurationBuilder configuration = new ConfigurationBuilder();
configuration.AddJsonFile(
"config.json",
optional: true,
reloadOnChange: true
);
IConfigurationRoot configurationRoot = configuration.Build();
/* string name = configurationRoot["name"];
Console.WriteLine($"name={name}");
string addr = configurationRoot.GetSection("proxy:address").Value;
Console.WriteLine($"addr={addr}");*/
/* Proxy proxy = configurationRoot.GetSection("proxy").Get<Proxy>();
Console.WriteLine($"{proxy.Address},{proxy.port}");*/
Config config = configurationRoot.Get<Config>();
Console.WriteLine(config.name);
Console.WriteLine(config.age);
Console.WriteLine(config.proxy.port);
Console.WriteLine(config.proxy.Address);
}
class Proxy
{
public string Address { get; set; }
public int port { get;set; }
}
class Config
{
public string name { get; set; }
public int age { get; set; }
public Proxy proxy { get; set; }
}
}
}
控制台展示
方式三
修改测试类
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
namespace Config1
{
public class Class1
{
static void Main(string[] args)
{
ServiceCollection serviceCollection = new ServiceCollection();
serviceCollection.AddScoped<Controller>();
ConfigurationBuilder configuration = new ConfigurationBuilder();
configuration.AddJsonFile(
"config.json",
optional: true,
reloadOnChange: true
);
IConfigurationRoot configurationRoot = configuration.Build();
serviceCollection.AddOptions().Configure<Config>(e=>configurationRoot.Bind(e));
using (var sp = serviceCollection.BuildServiceProvider())
{
var c = sp.GetRequiredService<Controller>();
c.Test();
}
/* string name = configurationRoot["name"];
Console.WriteLine($"name={name}");
string addr = configurationRoot.GetSection("proxy:address").Value;
Console.WriteLine($"addr={addr}");*/
/* Proxy proxy = configurationRoot.GetSection("proxy").Get<Proxy>();
Console.WriteLine($"{proxy.Address},{proxy.port}");*/
/* Config config = configurationRoot.Get<Config>();
Console.WriteLine(config.name);
Console.WriteLine(config.age);
Console.WriteLine(config.proxy.port);
Console.WriteLine(config.proxy.Address);*/
}
public class Proxy
{
public string Address { get; set; }
public int port { get;set; }
}
public class Config
{
public string name { get; set; }
public int age { get; set; }
public Proxy proxy { get; set; }
}
}
}
新增控制器
using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static Config1.Class1;
namespace Config1
{
public class Controller
{
public readonly IOptionsSnapshot<Config> optionConfig;
public Controller(IOptionsSnapshot<Config> optionConfig)
{
this.optionConfig = optionConfig;
}
public void Test()
{
Console.WriteLine(optionConfig.Value.name);
Console.WriteLine(optionConfig.Value.age);
Console.WriteLine(optionConfig.Value.proxy.Address);
Console.WriteLine(optionConfig.Value.proxy.port);
}
}
}
控制台输出
动态修改
若想控制台输出随着配置文件的修改而修改,可做出如下修改
using (var sp = serviceCollection.BuildServiceProvider())
{
// 配置之后,会在下一个scope中生效
using(var scope = sp.CreateScope())
{
var c = sp.GetRequiredService<Controller>();
c.Test();
Console.WriteLine("********************");
var c2 = sp.GetRequiredService<Controller2>();
c2.Test();
}
}
方式四_控制台输入
安装包
Microsoft.Extensions.Configuration.CommandLine
修改启动类
configuration.AddCommandLine(args);
控制台输入参数
进入 xxx\Config\bin\Debug\net6.0,输出cmd
控制台输入 Config1.exe name=lisi age=23
调试框输入参数
复杂结构配置
方式五_修改环境变量
下载包
Microsoft.Extensions.Configuration.Environment
修改环境变量
修改启动类
运行结果
隔离环境变量
指定环境变量前缀:
configuration.AddEnvironmentVariables("c1_");
只有前缀为"c1_"的环境变量才能被读取