13 | 配置绑定:使用强类型对象承载配置数据

要点:

1、支持将配置值绑定到已有对象

2、支持将配置值绑定到私有属性上

继续使用上一节代码

首先定义一个类作为接收配置的实例

class Config
{
public string Key1 { get; set; }
public bool Key5 { get; set; }
public int Key6 { get; set; }
}

接着看一下配置文件,appsettings.json

{
"Key1": "Value1",
"Key2": "Value2",
"Key5": true,
"Key6": 0
}

新增一个引用包

  • Microsoft.Extensions.Configuration.Binder

这个包的作用就是让我们能够很方便的把配置绑定到强类型上面去

主程序

var builder = new ConfigurationBuilder();
builder.AddJsonFile("appsettings.json", optional:true, reloadOnChange:true);
var configurationRoot = builder.Build(); var config = new Config()
{
Key1 = "config key1",
Key5 = false,
Key6 = 100
}; configurationRoot.Bind(config); Console.WriteLine($"Key1:{config.Key1}");
Console.WriteLine($"Key5:{config.Key5}");
Console.WriteLine($"Key6:{config.Key6}");

启动程序,输出如下:

Key1:Value1
Key5:True
Key6:0

可以看出,绑定的字段都是从配置中读出来的

实际上通常意义来讲,配置文件不会这么简单,一般都是有嵌套格式

{
"Key2": "Value2",
"Key6": 0,
"OrderService": {
"Key1": "order key1",
"Key5": true,
"Key6": 200
}
}

在这种情形下,需要把 section 绑定给 config 对象

configurationRoot.GetSection("OrderService").Bind(config);

这样就可以对不同的配置进行分组,并且分别绑定,避免配置混在一起

启动程序,输出如下:

Key1:order key1
Key5:True
Key6:200

也就是说可以从任意的节来读取配置,并且绑定到类型上面

这里定义的所有类型,所有的字段都是 public,但有一些场景下面可能是 private,对于私有的字段,默认情况下,是不会去绑定的,也不允许赋默认值,可以在定义时设置

class Config
{
public string Key1 { get; set; }
public bool Key5 { get; set; }
public int Key6 { get; private set; } = 100;
}

主程序

var config = new Config()
{
Key1 = "config key1",
Key5 = false
}; configurationRoot.GetSection("OrderService").Bind(config);

启动程序,输出如下:

Key1:order key1
Key5:True
Key6:100

可以看到 Key6 的值是100,没有发生变化,而配置中的值是200

要让私有变量生效,实际上 Bind 还有另外一个参数

configurationRoot.GetSection("OrderService").Bind(config,
binderOptions => { binderOptions.BindNonPublicProperties = true; });

启动程序,输出如下:

Key1:order key1
Key5:True
Key6:200

这样一来,私有字段也都可以从配置里面赋值了

GitHub源码链接:

https://github.com/MingsonZheng/DotNetCoreDevelopmentActualCombat/tree/main/ConfigurationFileDemo

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

欢迎转载、使用、重新发布,但务必保留文章署名 郑子铭 (包含链接: http://www.cnblogs.com/MingsonZheng/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。

如有任何疑问,请与我联系 (MingsonZheng@outlook.com) 。

.NET Core开发实战(第13课:配置绑定:使用强类型对象承载配置数据)--学习笔记的更多相关文章

  1. 2月送书福利:ASP.NET Core开发实战

    大家都知道我有一个公众号“恰童鞋骚年”,在公众号2020年第一天发布的推文<2020年,请让我重新介绍我自己>中,我曾说到我会在2020年中每个月为所有关注“恰童鞋骚年”公众号的童鞋们送一 ...

  2. .NET Core开发实战(第11课:文件配置提供程序)--学习笔记

    11 | 文件配置提供程序:自由选择配置的格式 文件配置提供程序 Microsoft.Extensions.Configuration.Ini Microsoft.Extensions.Configu ...

  3. [ASP.NET Core开发实战]基础篇06 配置

    配置,是应用程序很重要的组成部分,常常用于提供信息,像第三方应用登录钥匙.上传格式与大小限制等等. ASP.NET Core提供一系列配置提供程序读取配置文件或配置项信息. ASP.NET Core项 ...

  4. [ASP.NET Core开发实战]开篇词

    前言 本系列课程文章主要是学习官方文档,再输出自己学习心得,希望对你有所帮助. 课程大纲 本系列课程主要分为三个部分:基础篇.实战篇和部署篇. 希望通过本系列课程,能让大家初步掌握使用ASP.NET ...

  5. .NET Core开发的iNeuOS工业互联平台,升级四大特性:配置数据接口、图元绑定数据、预警配置和自定义菜单

    目       录 1.      概述... 2 2.      演示信息... 2 3.      iNeuView(Web组态)配置数据接口... 2 4.      iNeuView(Web组 ...

  6. [ASP.NET Core开发实战]基础篇01 Startup

    Startup,顾名思义,就是启动类,用于配置ASP.NET Core应用的服务和请求管道. Startup有两个主要作用: 通过ConfigureServices方法配置应用的服务.服务是一个提供应 ...

  7. 大数据学习笔记——Hadoop编程实战之HDFS

    HDFS基本API的应用(包含IDEA的基本设置) 在上一篇博客中,本人详细地整理了如何从0搭建一个HA模式下的分布式Hadoop平台,那么,在上一篇的基础上,我们终于可以进行编程实操了,同样,在编程 ...

  8. 2、SpringBoot接口Http协议开发实战8节课(1-6)

    1.SpringBoot2.xHTTP请求配置讲解 简介:SpringBoot2.xHTTP请求注解讲解和简化注解配置技巧 1.@RestController and @RequestMapping是 ...

  9. [ASP.NET Core开发实战]基础篇03 中间件

    什么是中间件 中间件是一种装配到应用管道,以处理请求和响应的组件.每个中间件: 选择是否将请求传递到管道中的下一个中间件. 可在管道中的下一个中间件前后执行. ASP.NET Core请求管道包含一系 ...

  10. [ASP.NET Core开发实战]基础篇02 依赖注入

    ASP.NET Core的底层机制之一是依赖注入(DI)设计模式,因此要好好掌握依赖注入的用法. 什么是依赖注入 我们看一下下面的例子: public class MyDependency { pub ...

随机推荐

  1. VueRouter和ReactRouter路由对比

    https://blog.csdn.net/xinxin_csdn/article/details/124652160

  2. babel相关配置

    npm install --save-dev @babel/core @babel/cli @babel/preset-env @babel/node npm install --save @babe ...

  3. JVM简单概述

    一.内存模型&分区 Java虚拟机在运行Java程序时,会管理着一块内存区域:运行时数据区 在运行时数据区里,会根据用途进行划分为以下模块: 1.Java虚拟机栈 2.本地方法栈 3.Java ...

  4. 引发C++异常的常见原因(一)从报错地址到错误症状

    在进行C++软件开发的过程中,会遇到很多问题,网上差不到,或者查到了也没什么信息可以用,所以这里想到了就将一些常见的问题放在一起,归纳整理一下. 本文主要的内容来源于CSDN的大佬文章:https:/ ...

  5. FinalShell上传文件失败

    1.问题 上传文件失败,如图所示,即使切换至root用户 2.解决方式 这里在建立SSH连接时,就必须使用root用户,而若使用普通用户,即使在其中切换至root用户,也无法上传. 所以重新建立一个r ...

  6. SpringBoot开启动态定时任务并手动、自动关闭

    场景需求:在执行某个方法的两小时之后进行某个操作 涉及:定时任务.哈希表 需要注意:业务逻辑层是单一实例的,所以在定时任务类内操作业务逻辑层的某个属性和在业务逻辑层内操作的都是同一个. 疑问:Thre ...

  7. [转帖]mysql8.0 MySQL函数

    PART1. MySQL函数介绍 函数表示对输入参数值返回一个具有特定关系的值,MySQL提供了大量丰富的函数,在进行数据库管理以及数据的查询和操作时将会经常用到各种函数.各类函数从功能方面主要分为数 ...

  8. Linux_sqlcmd或者是Cloudquery连接SQLSERVER2012的问题解决

    Linux_sqlcmd或者是Cloudquery连接SQLSERVER2012的问题解决 背景 最近想使用shell脚本给SQLServer数据库插入数据,但是发现了报错 同时进行CLoudquer ...

  9. 【转帖】MySQL 8.0.32如期而至

    MySQL 8.0版本计划 MySQL 8.0开始采用快速迭代开发模式,基本上是每隔3个月就发布一个新的小版本.去年1月18日(2022.1.18)发布MySQL 8.0.28,今年1月17日发布My ...

  10. [转帖]分享一个Navicat16最新版永久试用的办法

    https://zhuanlan.zhihu.com/p/614621302 新建bat,就叫 navicat无限试用.bat @echo off echo Delete HKEY_CURRENT_U ...