前言

前文中我们去获取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. 007-Java中方法的使用(基础篇)

    目录 一.方法的基本概述 一.方法的概述 二.方法的语法机制 三.方法的调用 一.方法的基本概述 一.方法的概述   方法其实就是一段可以完成某个特定功能的并且可以被重复利用的代码片段,方法的出现,让 ...

  2. 1151 LCA in a Binary Tree (30point(s))

    The lowest common ancestor (LCA) of two nodes U and V in a tree is the deepest node that has both U ...

  3. go gin框架和springboot框架WEB接口性能对比

    1 简要概述 最近看起go lang,真的被go的goroutine(协程)惊艳到了,一句 go function(){#todo},即可完成一个并发的工作. 看到gin这个web框架时,突然就特别想 ...

  4. 多维数据处理之主成分分析(PCA)

    在灵巧手与假手理论中,为了研究人手的运动协同关系,需要采集各个关节的运动学量或者多个采集点的肌电信号,然而由于人手关节数目或者EMG采集点数量较多,加上多次采样,导致需要过多的数据需要处理.然而事实上 ...

  5. 【策略模式】策略模式结合Spring实战Demo

    策略模式 策略模式用于解决判断分支过多的问题,使代码变得简洁和优雅, 策略模式在多种方式在项目中落地,下面举例说明通过指定不同类型的订单使用策略模式执行不同的业务逻辑 文章参考自公众号:石杉的架构笔记 ...

  6. Appium命令行启动,提示找不到命令,本地没有appium.cmd文件

    安装appium时,直接从github上下载的appium-desktop-windows版本,安装后,从打开桌面端Server,能启动服务,appium-doctor也能正常运行. 但奇怪的地方来了 ...

  7. SpringAOP_构造注入实现

    SpringAOP_构造注入实现 AOP_面向切面编程初步了解 让我们先想象一个场景,你正在编写一个项目,在开发过程中的多个模块都有某段重复的代码,于是你选择将其抽象成一个方法,然后在需要的地方调用这 ...

  8. [转]自建CDN防御DDoS

    自建CDN防御DDoS(1):知己知彼,建设持久防线 前言 本议题是我们在OWASP杭州区2013年岁末年初安全沙龙中进行分享的内容,在此我们对这个议题的整体内容进行了重新归纳梳理,形成了文字版. 在 ...

  9. React-列表 & Key

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title&g ...

  10. 3-5年以上的Android原生开发如何深入进阶?高级工程师必须要掌握哪些?

    前言 曾听过很多人说Android学习很简单,做个App就上手了,工作机会多,毕业后也比较容易找工作.这种观点可能是很多Android开发者最开始入行的原因之一. 在工作初期,工作主要是按照业务需求实 ...