前文中我们去获取value值的时候,都是通过configurationRoot 来获取的,如configurationRoot["key"],这种形式。
这种形式有一个不好的地方,那就是不方便。那么看下.net core如何将其转换为强类型。
正文引入:Microsoft.extensions.configuration.Binder 这个包。
配置文件内容如下:
{ "key1": "IamString", "key2": 10, "key3": true }代码:
class Program { static void Main(string[] args) { IConfigurationBuilder builder = new ConfigurationBuilder(); builder.AddJsonFile(System.AppDomain.CurrentDomain.BaseDirectory + "/appsettings.json",optional:false,reloadOnChange: true); var configurationRoot = builder.Build(); Config config = new Config(); configurationRoot.Bind(config); Console.WriteLine($"key1:{config.Key1}"); Console.WriteLine($"key2:{config.Key2}"); Console.WriteLine($"key3:{config.Key3}"); Console.ReadKey(); } } class Config { public string Key1 { get; set; } public int Key2 { get; set; } public bool Key3 { get; set; } }这样就绑定了我们的强类型,这里非常有用,后面在注册服务使用配置的时候,原理便是如此。
假如配置一个service服务,现在配置文件变成这样:
{ "key1": "IamString", "key2": 10, "key3": true, "Service": { "host": "127.0.0.1", "port": "8888" } }那么要获取service这个的配置怎么破?
static void Main(string[] args) { IConfigurationBuilder builder = new ConfigurationBuilder(); builder.AddJsonFile(System.AppDomain.CurrentDomain.BaseDirectory + "/appsettings.json",optional:false,reloadOnChange: true); var configurationRoot = builder.Build(); Service service = new Service(); configurationRoot.GetSection("Service").Bind(service); Console.WriteLine($"Service.Host {service.Host}"); Console.WriteLine($"Service.Host {service.Port}"); Console.ReadKey(); } class Service { public string Host { get; set; } public string Port { get; set; } }如果看过前面几篇的肯定知道为什么configurationRoot.GetSection("Service").Bind(service); 这样去绑定。
因为会把文件json转换为字典,字典的key是Service:Host 这种,而GetSection原理其实就是section+index字符拼接作为新的key。
这里展示转换为字典的结果:
上述这种方式可以注入进公共属性变量但是私有的不行。
static void Main(string[] args) { IConfigurationBuilder builder = new ConfigurationBuilder(); builder.AddJsonFile(System.AppDomain.CurrentDomain.BaseDirectory + "/appsettings.json",optional:false,reloadOnChange: true); var configurationRoot = builder.Build(); Service service = new Service(); configurationRoot.GetSection("Service").Bind(service); Console.WriteLine($"Service.Host {service.Host}"); Console.WriteLine($"Service.Host {service.Port}"); Console.ReadKey(); } class Service { public string Host { get; set; } public string Port { get; private set; } = "999"; }结果: 端口显示 999
这时候需要设置BindNonPublicProperties 为true
class Program { static void Main(string[] args) { IConfigurationBuilder builder = new ConfigurationBuilder(); builder.AddJsonFile(System.AppDomain.CurrentDomain.BaseDirectory + "/appsettings.json",optional:false,reloadOnChange: true); var configurationRoot = builder.Build(); Service service = new Service(); configurationRoot.GetSection("Service").Bind(service, BinderOptions => { BinderOptions.BindNonPublicProperties = true; }); Console.WriteLine($"Service.Host {service.Host}"); Console.WriteLine($"Service.Host {service.Port}"); Console.ReadKey(); } } class Service { public string Host { get; set; } public string Port { get; private set; } = "999"; }结果:
以上只是个人整理,如有错误望请指点,谢谢。
下一节 配置系统之简单版对接配置中心