传统配置方式
- 文件Web.config 进行配置。
- ConfigurationManager类配置。
.NET配置系统中支持配置方式
- 文件配置(json、xml、ini等)
- 注册表
- 环境变量
- 命令行
- 自定义配置源
Json文件配置方式
实现步骤:
-
创建一个json文件,把文件设置 为"如果较新则复制 ",这样编译后的文件会复制一份到bin目录下。
javascript{ "name": "wangxiaohua", "exclude": [ "**/bin", "**/bower_components", "**/jspm_packages", "**/node_modules", "**/obj", "**/platforms" ], "proxy":{ "key": "value", "age": 88 } }
-
Nuget安装
- Microsoft.Extensions.Configuration 配置框架基础包
- Microsoft.Extensions.Configuration.Json 读取json配置文件包
-
编写代码读取配置。
csnamespace ConsoleApp1 { internal class Program { static void Main(string[] args) { //创建配置构造器 ConfigurationBuilder builder = new ConfigurationBuilder(); //添加需要被读取的json文件, //optional参数是文件不存在是否报错 //reloadOnChange配置文件被更新时是否重新加载配置文件 builder.AddJsonFile("config.json", optional: true, reloadOnChange: true); //获得配置层级的根层级 IConfigurationRoot confRoot = builder.Build(); string name = confRoot["name"]; Console.WriteLine($"name={name}"); string value =confRoot.GetSection("proxy:key").Value; Console.WriteLine($"value={value}"); Console.ReadKey(); } } }
对象映射方式读取json文件
例如:
将配置内容映射成对象
javascript
{
"name":"wangwu",
"age":99,
"proxy":{"address":"192.168.0.1","port":"80"}
}
创建一个类文件,属性和配置文件中key相对应
cs
//把整个配置文件映射成一个对象
class Config {
public string Name { get; set; }
public int Age { get; set; }
public Proxy Proxy { get; set; }
}
//将proxy中的内容映射成一个类
class Proxy {
public string Address { get; set; }
public string Port { get; set; }
}
读取映射类,读取之前需要先安装NuGet包:Microsoft.Extensions.Configuration.Binder
cs
namespace ConsoleApp1
{
internal class Program
{
static void Main(string[] args)
{
//创建配置构造器
ConfigurationBuilder builder = new ConfigurationBuilder();
//添加需要被读取的json文件,
//optional参数是文件不存在是否报错
//reloadOnChange配置文件被更新时是否重新加载配置文件
builder.AddJsonFile("config.json", optional: true, reloadOnChange: true);
//获得配置层级的根层级
IConfigurationRoot confRoot = builder.Build();
Config config =confRoot.Get<Config>();
//获取配置文件中name的值
Console.WriteLine(config.Name);
//获取配置文件中port的值
Console.WriteLine(config.Proxy.port)
//读取指定对象
Porxy porxy =confRoot.GetSection("porxy").Get<Porxy>();
}
}
}
使用选项方式读取配置文件(推荐)
首先需要安装Nuget包:
Microsoft.Extensions.Configuration
Microsoft.Extensions.Configuration.Json
Microsoft.Extensions.Configuration.Binder
Microsoft.Extensions.Options
然后再读取配置文件时候,需要使用到DI注入IOptions<T>、IOptionsMonitor<T>、IOptionsSnapshot<T>类型。
IOptions<T>不会读取到更新的值
IOptionsSnapshot<T> 在一定的范围内读取的是原来的值
IOptionsMonitor<T> 立即读取到更新值
创建一个类文件:在这个文件中注入IOptionsSnapshot<T> 接口
cs
class OptionsConfig
{
//声明IOptionsSnapshot
private readonly IOptionsSnapshot<Config> options;
//使用构造方法方式进行注入
public OptionsConfig(IOptionsSnapshot<Config> options) {
this.options = options;
}
public void Test() {
Config config =options.Value;
Console.WriteLine(config.Name);
}
}
在使用读取配置文件
cs
static void Main(string[] args)
{
//创建DI容器对象
ServiceCollection services = new ServiceCollection();
//将OptionsConfig类注册到容器对象中
services.AddScoped<OptionsConfig>();
//创建配置构造器
ConfigurationBuilder builder = new ConfigurationBuilder();
//添加需要被读取的json文件,
//optional参数是文件不存在是否报错
//reloadOnChange配置文件被更新时是否重新加载配置文件
builder.AddJsonFile("config.json", optional: true, reloadOnChange: true);
//获得配置层级的根层级
IConfigurationRoot confRoot = builder.Build();
//添加选项所需的服务,把文件和节点进行绑定
// services.AddOptions().Configure<Config>(e=>confRoot.GetSection("proxy").Bind(e));
//使用Bind 需要安装 Microsoft.Extensions.Configuration.Binder 包
IServiceCollection serviceCollection = services.AddOptions().Configure<Config>(e=>confRoot.Bind(e));
using (var sp =services.BuildServiceProvider()) {
OptionsConfig config = sp.GetRequiredService<OptionsConfig>();
config.Test();
}
Console.ReadKey();
}
命令行方式进行配置:
需要安装包:Microsoft.Extensions.Configuration.CommandLine
cs
static void Main(string[] args)
{
//创建DI容器对象
ServiceCollection services = new ServiceCollection();
//将OptionsConfig类注册到容器对象中
services.AddScoped<OptionsConfig>();
//创建配置构造器
ConfigurationBuilder builder = new ConfigurationBuilder();
//---------------把原来添加读取JSON文件更换成命令行------------------
builder.AddCommandLine(args);
//----------------------------------
//获得配置层级的根层级
IConfigurationRoot confRoot = builder.Build();
//添加选项所需的服务,把文件和节点进行绑定
// services.AddOptions().Configure<Config>(e=>confRoot.GetSection("proxy").Bind(e));
//使用Bind 需要安装 Microsoft.Extensions.Configuration.Binder 包
IServiceCollection serviceCollection = services.AddOptions().Configure<Config>(e=>confRoot.Bind(e));
using (var sp =services.BuildServiceProvider()) {
OptionsConfig config = sp.GetRequiredService<OptionsConfig>();
config.Test();
}
Console.ReadKey();
}
使用时候就是在cmd窗口中使用,应用程序加参数方式。
调试时可以直接在IDE进行传递参数:
在项目上右键鼠标选择"属性"

在选择"调试" --》"启动配置文件"

直接在命令行参数中填写需要传递的参数

参数的扁平化配置(扁平就是把每个参数都展开)
如果在命令行中传递的不是简单是键值对,是比较复杂的对象或数组
对象属性传参格式:
类名:属性名=值
对象的数组传参格式:
类名:属性名:数组下标 = 值
cs
class Proxy {
public string Address { get; set; }
public string Port { get; set; }
public int[] Ids {get;set;}
}
比如上面的模型类是一个对象,对象中还有数组,在命令行中就需要使用到扁平化传参数。
传递参数应该是:

环境变量读取参数配置
1.首先也是需要安装Nuget包:
Microsoft.Extensions.Configuration.EnvironmentVariables
2.然后调用环境变量参数函数:configurationBuilder.AddEnvironmentVariables(),这个函数有无参数和有参数prefix参数重载版本。建议调用prefix版本(带前缀区别环境变量),加载参数时候会忽略prefix参数不会和系统配置环境变量冲突。
cs
static void Main(string[] args)
{
//创建DI容器对象
ServiceCollection services = new ServiceCollection();
//将OptionsConfig类注册到容器对象中
services.AddScoped<OptionsConfig>();
//创建配置构造器
ConfigurationBuilder builder = new ConfigurationBuilder();
//---------------把原来添加读取JSON文件更换成环境变量配置方式------------------
//----------------------------环境变量配置方式-------------------------------
builder.AddEnvironmentVariables();
//----------------------------------
//获得配置层级的根层级
IConfigurationRoot confRoot = builder.Build();
//添加选项所需的服务,把文件和节点进行绑定
// services.AddOptions().Configure<Config>(e=>confRoot.GetSection("proxy").Bind(e));
//使用Bind 需要安装 Microsoft.Extensions.Configuration.Binder 包
IServiceCollection serviceCollection = services.AddOptions().Configure<Config>(e=>confRoot.Bind(e));
using (var sp =services.BuildServiceProvider()) {
OptionsConfig config = sp.GetRequiredService<OptionsConfig>();
config.Test();
}
Console.ReadKey();
}
3.设置环境变量键值对:
ide调试参数配置:

部署环境,需要在 "我的电脑" --》属性--》高级--》环境变量中进行配置
开发自定义配置步骤
1.自己开发类需要实现IConfigurationProvider接口
实现 IConfigurationProvider的类有 ConfigurationProvider 和FileConfigurationProvider,重写Load方法,把数据扁平化设置到Data属性中即可。
2.在开发一个实现IConfigurationSource接口的类。读取文件可以继承类 FileConfigurationSource在重写Build方法中返回上面的ConfigurationProvider对象。
3.然后把ConfigurationSource对象加入到IConfigurationBuilder中 ,configurationBuilder.Add(new ConfigurationSource())