前言

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

结果:

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

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

重新整理 .net core 实践篇—————配置系统之强类型配置[十]的更多相关文章

  1. 重新整理 .net core 实践篇—————日志系统之结构化[十八]

    前言 什么是结构化呢? 结构化,就是将原本没有规律的东西进行有规律话. 就比如我们学习数据结构,需要学习排序然后又要学习查询,说白了这就是一套,没有排序,谈如何查询是没有意义的,因为查询算法就是根据某 ...

  2. 重新整理 .net core 实践篇—————日志系统之战地记者[十五]

    前言 本节开始整理日志相关的东西.先整理一下日志的基本原理. 正文 首先介绍一下包: Microsoft.Extengsion.Logging.Abstrations 这个是接口包. Microsof ...

  3. 重新整理 .net core 实践篇—————日志系统之作用域[十七]

    前言 前面介绍了服务与日志之间的配置,那么我们服务会遇到下面的场景会被遇到一些打log的问题. 前面我提及到我们的log,其实是在一个队列里面,而我们的请求是在并发的,多个用户同时发送请求这个时候我们 ...

  4. 重新整理 .net core 实践篇—————日志系统之服务与日志之间[十六]

    前言 前文介绍了一些基本思路,那么这里介绍一下,服务如何与配置文件配合. 正文 服务: public interface ISelfService { void ShowLog(); } public ...

  5. 重新整理 .net core 实践篇——— 权限源码阅读四十五]

    前言 简单介绍一下权限源码阅读一下. 正文 一直有人对授权这个事情上争论不休,有的人认为在输入账户密码给后台这个时候进行了授权,因为认为发送了一个身份令牌,令牌里面可能有些用户角色信息,认为这就是授权 ...

  6. 重新整理 .net core 实践篇————熔断与限流[三十五]

    前言 简单整理一下熔断与限流,跟上一节息息相关. 正文 polly 的策略类型分为两类: 被动策略(异常处理.结果处理) 主动策略(超时处理.断路器.舱壁隔离.缓存) 熔断和限流通过下面主动策略来实现 ...

  7. 重新整理 .net core 实践篇—————配置文件之环境配置[九]

    前言 在当今在互联网微服务比较适用的情况下,docker 可以说一个利器.每次我们打包docker的时候都是适用docker 的配置文件,那么配置文件里面会设置环境变量,这个时候需要我们的应用能够识别 ...

  8. 重新整理 .net core 实践篇————配置应用[一]

    前言 本来想整理到<<重新整理.net core 计1400篇>>里面去,但是后来一想,整理 .net core 实践篇 是偏于实践,故而分开. 因为是重新整理,那么就从配置开 ...

  9. 重新整理 .net core 实践篇————配置系统之盟约[五]

    前言 在asp .net core 中我们会看到一个appsettings.json 文件,它就是我们在服务中的各种配置,是至关重要的一部门. 不管是官方自带的服务,还是我们自己编写的服务都是用它来实 ...

随机推荐

  1. 闲暇时光里最好的挖矿体验——CPU挖乌龟币

    我之前其实是不玩加密货币的,主要是没有钱取投资(tou ji),也没有钱去投资矿机. 不过前几天CSDN推送了一个短文,<黑客用GitHub服务器挖矿,三天跑了3万个任务,代码惊现中文> ...

  2. Mybatis3源码笔记(六)SqlSession执行过程

    前几篇大致分析了初始化的过程,今天打算走一个SqlSession具体执行过程. @Test void shouldSelectAllAuthors() { try (SqlSession sessio ...

  3. Asp.Net Core&CAP实现分布式事务

    需要注意的是标题中的CAP不是指的CAP理论,而是园区大神杨晓东实现的框架,CAP框架基于本地消息表用最终一致性实现分布式事务. 本地消息表 首先我们考虑一个场景,在将用户信息更改后,需要发送一条消息 ...

  4. 轮子:DateUtil.java

    日期工具类 import java.text.SimpleDateFormat; import java.util.Date; public class DateUtil { public stati ...

  5. androguard安装和体验

    安装步骤按照官方教程https://code.google.com/p/androguard/wiki/Installation,下面记录下无法在ubuntu下apt-get的模块: python模块 ...

  6. JSON对象与字符串的互换——JSON.parse()和JSON.stringify()

    parse用于从一个字符串中解析出json对象,如 var str = '{"name":"huangxiaojian","age":&qu ...

  7. C++ 模板元编程简单小栗子

    最近看了看模板的元编程,感觉有点意思. 一些计算可以在编译过程就能够完成,榨干编译器的最后一点资源. stl中用的全是这些玩意. 当然,这增加了编译时长. 我记得貌似有"图灵完备" ...

  8. Day001 基本的Dos命令

    基本的Dos命令 打开cmd的方式 开始+系统+命令提示符(有时候需要右键以管理员身份运行) Win+R键,输入cmd打开控制台 按住shift键的同时鼠标右键,点击在此处打开powershell窗口 ...

  9. 解决客户端Redis中文乱码问题

    启动客户端的时候添加 --raw 选项即可 wangyulong@code-local:~$ redis-cli 127.0.0.1:6379> set key1 '上海' OK 127.0.0 ...

  10. angularjs中的常遇问题整理

    1.页面中默认图片的显示 {{img || "/upload/img.png"}} 2.接口中的数据没有及时读取到,$apply $.post( url, {}, function ...