前言

前文中我们去获取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";
}

结果:

以上只是个人整理,如有错误望请指点,谢谢。

下一节 配置系统之简单版对接配置中心

最新文章

  1. jqueyr eq get用法
  2. LightHttpd源码分析
  3. 程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。(C#语言)
  4. 3、JavaScript
  5. 一个小makefile程序
  6. PHP的优点
  7. 本人第一个android游戏《新连连看》上架
  8. js管理内存
  9. 解密SuperWebview的一种另类方法
  10. JAVA提高六:泛型
  11. Oracle-03:关系型数据库和非关系的数据库的各自优缺点与区别
  12. LFYZ-OJ ID: 1010 天使的起誓
  13. 2019/4/15 wen 正则表达式
  14. JavaScript之函数(上)
  15. 洛谷.4245.[模板]任意模数NTT(MTT/三模数NTT)
  16. spoj IITWPC4F - Gopu and the Grid Problem 线段树
  17. 评点SAP HR功能及人力资源管理软件
  18. 获取GetOpenFileName多选文件名
  19. quartz 的简单使用
  20. 翻翻git之---效果鲜明的类ViewPager库 ConvenientBanner(对图片载入部分进行改动)

热门文章

  1. 实现服务端和客户端的实时双向数据传输-WebSocket简单了解
  2. k8s configmap 挂载配置文件
  3. 用html自己开发自己的串口TCP通讯调试软件
  4. Swagger快速入门教程笔记
  5. 浅谈Java的反射机制和作用
  6. 【swagger】 swagger-ui的升级版swagger-bootstrap-ui
  7. 【接口设计】用户积分排行榜功能-Redis实现
  8. 声明:songzijian这个域名已经被抢注。大家别上了。不是我了。
  9. CTF密码学常见加解密总结
  10. Android 面试必备 - 系统、App、Activity 启动过程“一锅端”