五分钟了解dotnetcore配置框架

一、前言

配置的本质就是字符串的键值对,微软的一系列接口其实就是对这些键值对字符串的抽象。

二、基本类型

2.1、Nuget包

  • Microsoft.Extensions.Configuration.Abstractions

  • Microsoft.Extensions.Configuration

2.2、抽象接口

  • IConfiguration

    • 提供了查询、设置配置项、监控变化等方法

  • IConfigurationRoot

    • 在IConfiguration接口基础上,增加了 Reload 方法强制从provider中重新加载配置值

  • IConfigurationSection

    • 对配置节点的抽象

  • IConfigurationBuilder

    • 根据提供的数据源注册并构建IConfiguration

  • IConfigurationSource

    • 对数据源的抽象,例如Json、xml、环境变量、内存变量等

  • IConfigurationProvider

    • 规定了配置项的获取、设置、重载等统一的行为

三、基本配置

注:各种配置方式的目的是在控制台中输出以下内容,如下图:

3.1、加载内存中的配置

  • 需要引入包:Microsoft.Extensions.Configuration

  • 主要方法:builder.AddInMemoryCollection()

static void Main(string[] args)
{IConfigurationBuilder builder = new ConfigurationBuilder();var memoryData = new Dictionary<string, string>();memoryData.Add("Student:Code", "10002385");memoryData.Add("Student:Name", "LiuSan");builder.AddInMemoryCollection(memoryData);IConfigurationRoot configurationRoot = builder.Build();IConfigurationSection configurationSection = configurationRoot.GetSection("Student");Console.WriteLine($"Code:{configurationSection["Code"]}");Console.WriteLine($"Name:{configurationSection["Name"]}");        Console.Read();
}

3.2、加载环境变量中的配置

  • 需要引入包:Microsoft.Extensions.Configuration.EnvironmentVariables

  • 主要方法:builder.AddEnvironmentVariables()

  • 环境变量中层级关系使用 __ 代替 :

static void Main(string[] args)
{IConfigurationBuilder builder = new ConfigurationBuilder();builder.AddEnvironmentVariables();IConfigurationRoot configurationRoot = builder.Build();IConfigurationSection configurationSection = configurationRoot.GetSection("Student");Console.WriteLine($"Code:{configurationSection["Code"]}");Console.WriteLine($"Name:{configurationSection["Name"]}");Console.Read();
}

3.3、加载命令行中的配置

  • 需要引入包:Microsoft.Extensions.Configuration.CommandLine

  • 主要方法:builder.AddCommandLine(args)

  • 命令行中使用--表示配置项,层级关系使用:

  • 主要在docker中使用

static void Main(string[] args)
{IConfigurationBuilder builder = new ConfigurationBuilder();builder.AddCommandLine(args);IConfigurationRoot configurationRoot = builder.Build();IConfigurationSection configurationSection = configurationRoot.GetSection("Student");Console.WriteLine($"Code:{configurationSection["Code"]}");Console.WriteLine($"Name:{configurationSection["Name"]}");Console.Read();
}

3.4、加载Json中的配置

  • 需要引入包:Microsoft.Extensions.Configuration.Json

  • 主要方法:builder.AddJsonFile("appsettings.json")

static void Main(string[] args)
{IConfigurationBuilder builder = new ConfigurationBuilder();builder.AddJsonFile("appsettings.json");IConfigurationRoot configurationRoot = builder.Build();IConfigurationSection configurationSection = configurationRoot.GetSection("Student");Console.WriteLine($"Code:{configurationSection["Code"]}");Console.WriteLine($"Name:{configurationSection["Name"]}");Console.Read();
}

3.5、加载xml中的配置

  • 需要引入包:Microsoft.Extensions.Configuration.Xml

  • 主要方法:builder.AddXmlFile("appsettings.xml")

  • xml中不会读取最外层,所以Section必需从第二层开始

static void Main(string[] args)
{IConfigurationBuilder builder = new ConfigurationBuilder();builder.AddXmlFile("appsettings.xml");IConfigurationRoot configurationRoot = builder.Build();IConfigurationSection configurationSection = configurationRoot.GetSection("Student");Console.WriteLine($"Code:{configurationSection["Code"]}");Console.WriteLine($"Name:{configurationSection["Name"]}");Console.Read();
}

四、高级配置

4.1、将配置绑定至强对象

  • 需要引入包:Microsoft.Extensions.Configuration.Binder

  • 主要方法:configurationRoot.GetSection("Student").Bind(student)

  class Program{static void Main(string[] args){IConfigurationBuilder builder = new ConfigurationBuilder();builder.AddJsonFile("appsettings.json");IConfigurationRoot configurationRoot = builder.Build();var student = new Student();configurationRoot.GetSection("Student").Bind(student);Console.WriteLine($"Code:{student.Code}");Console.WriteLine($"Name:{student.Name}");Console.Read();}}class Student{public string Code { get; set; }public string Name { get; set; }}

4.2、IOptions

  • 需要引入包:Microsoft.Extensins.Options

  • 需要引入包:Microsoft.Extensions.Options.ConfigurationExtensions

  • 本质其实就是将一个Section配置节点映射到一个实体对象

    class Program{static void Main(string[] args){IConfigurationBuilder builder = new ConfigurationBuilder();builder.AddJsonFile("appsettings.json");IConfigurationRoot configurationRoot = builder.Build();IServiceCollection services = new ServiceCollection();services.Configure<WeixinOptions>(configurationRoot.GetSection("WeixinSetting"));services.AddScoped<IWeixinService, WeixinService>();var provider = services.BuildServiceProvider();var weixinService = provider.GetService<IWeixinService>();string appId = weixinService.AppId;string token = weixinService.Token;Console.Read();}}interface IWeixinService{string AppId { get; }string Token { get; }}class WeixinService: IWeixinService{IOptions<WeixinOptions> _options;public WeixinService(IOptions<WeixinOptions> options){_options = options;}public string AppId { get => _options.Value.AppId; }public string Token { get => _options.Value.Token;}}class WeixinOptions{public string AppId { get; set; }public string Token { get; set; }}

4.3、热更新

  • IConfigurationBuilder添加数据源时设置reloadOnChange=true

  • 监听的核心方法:var token = configurationRoot.GetReloadToken();

 static void Main(string[] args){IConfigurationBuilder builder = new ConfigurationBuilder();builder.AddJsonFile("appsettings.json", optional:false, reloadOnChange:true);IConfigurationRoot configurationRoot = builder.Build();IConfigurationSection configurationSection = configurationRoot.GetSection("Student");var token = configurationRoot.GetReloadToken();ChangeToken.OnChange(() => configurationRoot.GetReloadToken(), () => {Console.WriteLine("配置发生改变了...");Console.WriteLine($"Code:{configurationSection["Code"]}");Console.WriteLine($"Name:{configurationSection["Name"]}");});           Console.Read();}


五、总结

  • 配置就是key-value键值对字符串

  • IConfiguration和IConfigurationRoot是对键值对的抽象

  • IConfigurationBuilder用于构建IConfiguration和IConfigurationRoot

  • IConfigurationSource是对数据源的抽象

  • IConfigurationProvider将不同来源的IConfigurationSource 转为统一的模型

  • IOptions方便将不同的配置节点(Path)映射为对应的强类型对象

  • IConfigurationBuilder添加多个数据源(IConfigurationSource)后,如果key重名,则以最后一个配置为准(覆盖前面)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/310200.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

彩光和灰光模块_5G承载网主要光模块图谱

&#xff08;一&#xff09;5G承载光模块总览在光通信中&#xff0c;业务信息的传送与接收都是靠光模块来实现的。在发送端&#xff0c;光模块完成电/光转换&#xff0c;光在光纤中传输&#xff0c;然后在接收端实现光/电转换。可以说&#xff0c;没有光模块就没有光通信。在我…

Mobius 一个运行在 .NET Core 上的 .NET 运行时

导语一个 .NET 应用仅仅只是一块在 .NET 运行时上面运行的二进制代码。而 .NET 运行时只是一个能执行这项任务的程序。当前的 .NET Framework 和 .NET Core 运行时采用 C 编写&#xff0c;而 Mobius 是一个使用 C# 重写的 .NET 运行时&#xff0c;重写包括 JIT 编译和 GC 等&am…

Autofac的切面编程实现

面向切面编程&#xff1a;Autofac.Annotation扩展组件是我开源的一款利用打标签完成autofac容器的注入组件。https://github.com/yuzd/Autofac.Annotation我们之前介绍了利用Aspect标签来完成拦截器功能Aspect是一对一的方式&#xff0c;我想要某个class开启拦截器功能我需要针…

[Java基础]体验Lambda表达式

普通写法: 代码如下: package LambdaPack01;public class MyRunnable implements Runnable{Overridepublic void run() {System.out.println("多线程启动了");} }package LambdaPack01;public class LambdaDemo01 {public static void main(String[] args) {MyRunna…

linux启动mqtt_linux下安装MQTT服务器 - EMQTT

1. 下载从官网下载https://www.emqx.io/downloads#broker&#xff0c; 本文所用版本为broker/v3.2.1/emqx-centos7-v3.2.1.ziplinux下 下载:wget https://www.emqx.io/downloads/broker/v3.2.1/emqx-centos7-v3.2.1.zip解压&#xff1b;unzip emqx-centos7-v3.2.1.zip所在目录&…

.net core 基于Dapper 的分库分表开源框架(core-data)

一、前言感觉很久没写文章了&#xff0c;最近也比较忙&#xff0c;写的相对比较少&#xff0c;抽空分享基于Dapper 的分库分表开源框架core-data的强大功能&#xff0c;更好的提高开发过程中的效率&#xff1b;在数据库的数据日积月累的积累下&#xff0c;业务数据库中的单表数…

[Java基础]Lambda表达式练习

代码如下: package LambdaPracticePack;public interface Eatable {void eat(); }package LambdaPracticePack;public class EatableImpl implements Eatable{Overridepublic void eat() {System.out.println("一天一苹果&#xff0c;医生远离我");} }package Lambd…

​你可能不知道的7个HTML小技巧

五一期间&#xff0c;知道大家都比较懒&#xff0c;我也是。所以写篇简单且基础的技术小文&#xff0c;不需要动脑子&#xff0c;扫一眼就能掌握的那种。DETAILS 标签<details> 标签将额外的详情信息隐藏起来&#xff0c;用户在需要的时候点击即可展开查看详情。<deta…

青年节寄语和新课程免费上架

大家好&#xff0c;确实好久没有写东西了&#xff0c;希望这篇推送不是用来提醒你取消关注哈。2020年这突如其来的疫情&#xff0c;打乱了我们的生活&#xff0c;也让很多人更加明白了生活的无常以及可贵吧&#xff0c;在此也真诚希望大家都要好好哒&#xff0c;不负韶华&#…

从堆里找回“丢失”的代码相关命令简介

前言 在上一篇文章中&#xff0c;我们主要使用了三个命令 !address&#xff0c;s&#xff0c;.writemem 把丢失的代码成功的保存到了文件中。本文简单介绍一下上文用到的这三个命令。windbg 中的地址范围语法 很多命令都会用到 地址范围。比如 s 命令&#xff0c;.writemem 命令…

慎用ToLower和ToUpper,小心把你的系统给拖垮了

不知道何时开始&#xff0c;很多程序员喜欢用ToLower&#xff0c;ToUpper去实现忽略大小写模式的字符串相等性比较&#xff0c;有可能这个习惯是从别的语言引进的&#xff0c;大胆猜测下是JS&#xff0c;为了不引起争论&#xff0c;我指的JS是技师的意思~一&#xff1a;背景1. …

mysql 2008 日_SQL2008 的 日期数据类型

摘要你是否曾经想在数据库中存储一个日期而没有时间部分&#xff0c;或者想存储一个时间值希望有更高的精度&#xff1f;在SQL Server 2008的介绍中&#xff0c;微软介绍了一些新的日期数据类允许你只存储一个日期、更高精度的时间值等。这些新的数据类型为你存储日期和时间相关…

别了,JavaScript;你好,Blazor

Web开发与JavaScript开发向来是同义词。直到WebAssembly的横空出世&#xff0c;WebAssembly (Wasm)是一种在浏览器中可以执行的二进制指令。WebAssembly 的 官方工具链 能够编译 C/C 代码&#xff0c;但许多社区也提供了不同语言的编译器&#xff0c;如 Rust&#xff0c;Python…

[Java基础]接口组成(默认方法,静态方法,私有方法)

默认方法: 代码如下: package MyInterfacePack;public interface MyInterface {void show1();void show2();// void show3();public default void show3(){System.out.println("show3");};}package MyInterfacePack;public class MyInterfaceImplOne implements …

linux jdk1.7 tomcat mysql_Linux环境搭建 jdk+tomcat+mysql

好久之前搭建的&#xff0c;现在记录下 防止下次配置去找安装jdk(jre也行),tomcat MySQL一、jdk安装及环境变量配置:我是用 jdk-8u191-linux-x64.tar.gz 安装的安装之前提前下载好 jdk版本 看你用什么版本吧 都一样的步骤 按照下面的步骤操作 要确保完全是一个新环境…

开源 一套 Blazor Server 端精致套件

Blazor 作为一种 Web 开发的新技术已经发展有一段时间了&#xff0c;有些人标称 无 JS 无 TS&#xff0c;我觉得有点误导新人的意味&#xff0c;也有人文章大肆宣传 Blazor 是 JavaScript 的终结者&#xff0c;是为了替代 JavaScript 而生的&#xff0c;我认为这些言论都太激进…