重新整理 .net core 实践篇—————配置系统之强类型配置[十]
前言
前文中我们去获取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 实践篇—————配置系统之强类型配置[十]的更多相关文章
- 重新整理 .net core 实践篇—————日志系统之结构化[十八]
前言 什么是结构化呢? 结构化,就是将原本没有规律的东西进行有规律话. 就比如我们学习数据结构,需要学习排序然后又要学习查询,说白了这就是一套,没有排序,谈如何查询是没有意义的,因为查询算法就是根据某 ...
- 重新整理 .net core 实践篇—————日志系统之战地记者[十五]
前言 本节开始整理日志相关的东西.先整理一下日志的基本原理. 正文 首先介绍一下包: Microsoft.Extengsion.Logging.Abstrations 这个是接口包. Microsof ...
- 重新整理 .net core 实践篇—————日志系统之作用域[十七]
前言 前面介绍了服务与日志之间的配置,那么我们服务会遇到下面的场景会被遇到一些打log的问题. 前面我提及到我们的log,其实是在一个队列里面,而我们的请求是在并发的,多个用户同时发送请求这个时候我们 ...
- 重新整理 .net core 实践篇—————日志系统之服务与日志之间[十六]
前言 前文介绍了一些基本思路,那么这里介绍一下,服务如何与配置文件配合. 正文 服务: public interface ISelfService { void ShowLog(); } public ...
- 重新整理 .net core 实践篇——— 权限源码阅读四十五]
前言 简单介绍一下权限源码阅读一下. 正文 一直有人对授权这个事情上争论不休,有的人认为在输入账户密码给后台这个时候进行了授权,因为认为发送了一个身份令牌,令牌里面可能有些用户角色信息,认为这就是授权 ...
- 重新整理 .net core 实践篇————熔断与限流[三十五]
前言 简单整理一下熔断与限流,跟上一节息息相关. 正文 polly 的策略类型分为两类: 被动策略(异常处理.结果处理) 主动策略(超时处理.断路器.舱壁隔离.缓存) 熔断和限流通过下面主动策略来实现 ...
- 重新整理 .net core 实践篇—————配置文件之环境配置[九]
前言 在当今在互联网微服务比较适用的情况下,docker 可以说一个利器.每次我们打包docker的时候都是适用docker 的配置文件,那么配置文件里面会设置环境变量,这个时候需要我们的应用能够识别 ...
- 重新整理 .net core 实践篇————配置应用[一]
前言 本来想整理到<<重新整理.net core 计1400篇>>里面去,但是后来一想,整理 .net core 实践篇 是偏于实践,故而分开. 因为是重新整理,那么就从配置开 ...
- 重新整理 .net core 实践篇————配置系统之盟约[五]
前言 在asp .net core 中我们会看到一个appsettings.json 文件,它就是我们在服务中的各种配置,是至关重要的一部门. 不管是官方自带的服务,还是我们自己编写的服务都是用它来实 ...
随机推荐
- 闲暇时光里最好的挖矿体验——CPU挖乌龟币
我之前其实是不玩加密货币的,主要是没有钱取投资(tou ji),也没有钱去投资矿机. 不过前几天CSDN推送了一个短文,<黑客用GitHub服务器挖矿,三天跑了3万个任务,代码惊现中文> ...
- Mybatis3源码笔记(六)SqlSession执行过程
前几篇大致分析了初始化的过程,今天打算走一个SqlSession具体执行过程. @Test void shouldSelectAllAuthors() { try (SqlSession sessio ...
- Asp.Net Core&CAP实现分布式事务
需要注意的是标题中的CAP不是指的CAP理论,而是园区大神杨晓东实现的框架,CAP框架基于本地消息表用最终一致性实现分布式事务. 本地消息表 首先我们考虑一个场景,在将用户信息更改后,需要发送一条消息 ...
- 轮子:DateUtil.java
日期工具类 import java.text.SimpleDateFormat; import java.util.Date; public class DateUtil { public stati ...
- androguard安装和体验
安装步骤按照官方教程https://code.google.com/p/androguard/wiki/Installation,下面记录下无法在ubuntu下apt-get的模块: python模块 ...
- JSON对象与字符串的互换——JSON.parse()和JSON.stringify()
parse用于从一个字符串中解析出json对象,如 var str = '{"name":"huangxiaojian","age":&qu ...
- C++ 模板元编程简单小栗子
最近看了看模板的元编程,感觉有点意思. 一些计算可以在编译过程就能够完成,榨干编译器的最后一点资源. stl中用的全是这些玩意. 当然,这增加了编译时长. 我记得貌似有"图灵完备" ...
- Day001 基本的Dos命令
基本的Dos命令 打开cmd的方式 开始+系统+命令提示符(有时候需要右键以管理员身份运行) Win+R键,输入cmd打开控制台 按住shift键的同时鼠标右键,点击在此处打开powershell窗口 ...
- 解决客户端Redis中文乱码问题
启动客户端的时候添加 --raw 选项即可 wangyulong@code-local:~$ redis-cli 127.0.0.1:6379> set key1 '上海' OK 127.0.0 ...
- angularjs中的常遇问题整理
1.页面中默认图片的显示 {{img || "/upload/img.png"}} 2.接口中的数据没有及时读取到,$apply $.post( url, {}, function ...