配置系统基本使用
.Net Core配置系统支持文件(Json、XML、INI)、注册表、环境变量、命令行、AZure Key Vault等。
案例,使用jsonwen文件来配置。
新建config.json文件,程序默认加载exe同目录下的配置文件,所以应设置config.json“复制到输出目录”属性为“如果较新则复制”
1 2 3 4 5 6 7
| { "name": "zack", "proxy": { "address": "192.168.1.9", "port": 1088 } }
|
.net core系统配置开发包为Microsoft.Extensions.Configuration,读取JSON文件应使用Microsoft.Extensions.Configuration.Json。
1 2 3 4 5 6 7 8 9 10
| using Microsoft.Extensions.Configuration;
ConfigurationBuilder configBuilder = new ConfigurationBuilder();
configBuilder.AddJsonFile("config.json", optional: false, reloadOnChange: false);
IConfigurationRoot config = configBuilder.Build(); string name = config["name"]; string proxyAddress = config.GetSection("proxy:address").Value;
|
选项方式读取配置
选项方式可以和依赖注入结合,同时可以实现修改配置后自动刷新。
需要安装Microsoft.Extensions.Options和Microsoft.Extensions.Binder。
案例:
- 新建appsettings.json文件
1 2 3 4 5 6 7 8 9 10 11 12 13
| { "Logging": { "LogLevel": { "Default": "Warning" } }, "DB": { "DbType": "SQLServer", "ConnectionString": "Data Source=.;Initial Catalog=DemoDB; Integrated Security=True" }, "Smtp": { "Server": "smtp.youzack.com", "UserName": "zack", "Password": "hello888" }, "AllowedHosts": "*" }
|
- 我们只对DB和Smtp感兴趣,建立另个对应的模型类
1 2 3 4 5 6 7 8 9 10 11
| public class DbSettings { public string DbType { get; set; } public string ConnectionString { get; set; } } public class SmtpSettings { public string Server { get; set; } public string UserName { get; set; } public string Password { get; set; } }
|
使用选项方式读取配置时需要和依赖注入一起使用,所以创建一个类哟用于获取注入的选项值。接收选项注入的对象有:
IOptions<T>
:配置改变后,不能读取新的值,必须重启程序
IOptionsMonitor<T>
:配置改变后可以读取新的值,A、B两处都读取某个选项值,在A之后B之前配置项改变,A仍然是旧值,B是新值
IOptionsSnapshot<T>
:和IOptionsMonitor<T>
不同之处在于AB都是旧值,再次进入这个范围才会读到新值
- 测试读取Demo类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| using Microsoft.Extensions.Options;
class Demo { private readonly IOptionsSnapshot<DbSettings> optDbSettings; private readonly IOptionsSnapshot<SmtpSettings> optSmtpSettings; public Demo(IOptionsSnapshot<DbSettings> optDbSettings, IOptionsSnapshot<SmtpSettings> optSmtpSettings) { this.optDbSettings = optDbSettings; this.optSmtpSettings = optSmtpSettings; } public void Test() { var db = optDbSettings.Value; Console.WriteLine($"数据库:{db.DbType},{db.ConnectionString}"); var smtp = optSmtpSettings.Value; Console.WriteLine($"Smtp:{smtp.Server},{smtp.UserName},{smtp.Password}"); } }
|
- 注入服务到容器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection;
ConfigurationBuilder confi gBuilder = new ConfigurationBuilder(); configBuilder.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); IConfigurationRoot config = configBuilder.Build(); ServiceCollection services = new ServiceCollection(); services.AddOptions() .Configure<DbSettings>(e=>config.GetSection("DB").Bind(e)) .Configure<SmtpSettings>(e => config.GetSection("Smtp").Bind(e));
services.AddTransient<Demo>(); using (var sp = services.BuildServiceProvider()) { while (true) { using (var scope = sp.CreateScope()) { var spScope = scope.ServiceProvider; var demo = spScope.GetRequiredService<Demo>(); demo.Test(); } Console.WriteLine("可以改配置啦"); Console.ReadKey(); } }
|
从命令行读取配置
适合容器化的运行环境
1 2 3 4 5 6
| ConfigurationBuilder configBuilder = new ConfigurationBuilder(); configBuilder.AddCommandLine(args); IConfigurationRoot config = configBuilder.Build(); string server = config["server"]; Console.WriteLine($"server:{server}");
|
从环境变量读取配置
1 2 3 4 5 6 7 8
| ConfigurationBuilder configBuilder = new ConfigurationBuilder();
configBuilder.AddEnvironmentVariables("TEST_"); IConfigurationRoot configRoot = configBuilder.Build(); string name = configRoot["Name"]; Console.WriteLine(name);
|
多配制源
场景:开发的软件可以从服务器中读取配置,但是我们想临时更改配置又不影响其他用户,并且日后不想用了可以直接删除本地配置即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| ConfigurationBuilder configBuilder = new ConfigurationBuilder();
configBuilder.AddJsonFile("appsettings.json") .AddEnvironmentVariables("Test1_").AddCommandLine(args); IConfigurationRoot config = configBuilder.Build(); string server = config["Server"]; string userName = config["UserName"]; string password = config["Password"]; string port = config["Port"];
Console.WriteLine(config.GetDebugView());
|