.NET Core中的配置系统

传统配置方式

  • 文件Web.config 进行配置。
  • ConfigurationManager类配置。

.NET配置系统中支持配置方式

  • 文件配置(json、xml、ini等)
  • 注册表
  • 环境变量
  • 命令行
  • 自定义配置源

Json文件配置方式

实现步骤:

  1. 创建一个json文件,把文件设置 为“如果较新则复制”,这样编译后的文件会复制一份到bin目录下。
    1. {"name": "wangxiaohua","exclude": ["**/bin","**/bower_components","**/jspm_packages","**/node_modules","**/obj","**/platforms"],"proxy":{"key": "value","age": 88}
      }

  2. Nuget安装
    1. Microsoft.Extensions.Configuration 配置框架基础包
    2. Microsoft.Extensions.Configuration.Json 读取json配置文件包
  3. 编写代码读取配置。
    namespace ConsoleApp1
    {internal class Program{static void Main(string[] args){//创建配置构造器ConfigurationBuilder builder = new ConfigurationBuilder();//添加需要被读取的json文件,//optional参数是文件不存在是否报错//reloadOnChange配置文件被更新时是否重新加载配置文件builder.AddJsonFile("config.json", optional: true, reloadOnChange: true);//获得配置层级的根层级IConfigurationRoot confRoot = builder.Build();string name = confRoot["name"];Console.WriteLine($"name={name}");string value =confRoot.GetSection("proxy:key").Value;Console.WriteLine($"value={value}");Console.ReadKey();}}
    }

    对象映射方式读取json文件

        例如:

        将配置内容映射成对象

{
“name”:"wangwu",
"age":99,
"proxy":{"address":"192.168.0.1","port":"80"}}

创建一个类文件,属性和配置文件中key相对应

 //把整个配置文件映射成一个对象
class Config { public string Name { get; set; }public int Age { get; set; }public Proxy Proxy { get; set; }}//将proxy中的内容映射成一个类class Proxy { public string Address { get; set; }public string Port { get; set; }}

读取映射类,读取之前需要先安装NuGet包:Microsoft.Extensions.Configuration.Binder

namespace ConsoleApp1
{internal class Program{static void Main(string[] args){//创建配置构造器ConfigurationBuilder builder = new ConfigurationBuilder();//添加需要被读取的json文件,//optional参数是文件不存在是否报错//reloadOnChange配置文件被更新时是否重新加载配置文件builder.AddJsonFile("config.json", optional: true, reloadOnChange: true);//获得配置层级的根层级IConfigurationRoot confRoot = builder.Build();Config config =confRoot.Get<Config>();//获取配置文件中name的值Console.WriteLine(config.Name);//获取配置文件中port的值Console.WriteLine(config.Proxy.port)//读取指定对象Porxy  porxy =confRoot.GetSection("porxy").Get<Porxy>();}}
}

使用选项方式读取配置文件(推荐)

首先需要安装Nuget包:

Microsoft.Extensions.Configuration

Microsoft.Extensions.Configuration.Json

Microsoft.Extensions.Configuration.Binder

Microsoft.Extensions.Options

然后再读取配置文件时候,需要使用到DI注入IOptions<T>、IOptionsMonitor<T>、IOptionsSnapshot<T>类型。

IOptions<T>不会读取到更新的值

IOptionsSnapshot<T> 在一定的范围内读取的是原来的值

IOptionsMonitor<T> 立即读取到更新值

创建一个类文件:在这个文件中注入IOptionsSnapshot<T> 接口

 class OptionsConfig
{//声明IOptionsSnapshot private readonly IOptionsSnapshot<Config> options;//使用构造方法方式进行注入public OptionsConfig(IOptionsSnapshot<Config> options) { this.options = options;}public void Test() {Config config =options.Value;Console.WriteLine(config.Name);}}

在使用读取配置文件

    static void Main(string[] args){//创建DI容器对象ServiceCollection services = new ServiceCollection();//将OptionsConfig类注册到容器对象中services.AddScoped<OptionsConfig>();//创建配置构造器ConfigurationBuilder builder = new ConfigurationBuilder();//添加需要被读取的json文件,//optional参数是文件不存在是否报错//reloadOnChange配置文件被更新时是否重新加载配置文件builder.AddJsonFile("config.json", optional: true, reloadOnChange: true);//获得配置层级的根层级IConfigurationRoot confRoot = builder.Build();//添加选项所需的服务,把文件和节点进行绑定// services.AddOptions().Configure<Config>(e=>confRoot.GetSection("proxy").Bind(e));//使用Bind 需要安装 Microsoft.Extensions.Configuration.Binder 包IServiceCollection serviceCollection = services.AddOptions().Configure<Config>(e=>confRoot.Bind(e));using (var sp =services.BuildServiceProvider()) {OptionsConfig config = sp.GetRequiredService<OptionsConfig>();config.Test();}Console.ReadKey();}

命令行方式进行配置:

需要安装包:Microsoft.Extensions.Configuration.CommandLine

    static void Main(string[] args){//创建DI容器对象ServiceCollection services = new ServiceCollection();//将OptionsConfig类注册到容器对象中services.AddScoped<OptionsConfig>();//创建配置构造器ConfigurationBuilder builder = new ConfigurationBuilder();//---------------把原来添加读取JSON文件更换成命令行------------------builder.AddCommandLine(args); //----------------------------------//获得配置层级的根层级IConfigurationRoot confRoot = builder.Build();//添加选项所需的服务,把文件和节点进行绑定// services.AddOptions().Configure<Config>(e=>confRoot.GetSection("proxy").Bind(e));//使用Bind 需要安装 Microsoft.Extensions.Configuration.Binder 包IServiceCollection serviceCollection = services.AddOptions().Configure<Config>(e=>confRoot.Bind(e));using (var sp =services.BuildServiceProvider()) {OptionsConfig config = sp.GetRequiredService<OptionsConfig>();config.Test();}Console.ReadKey();}

使用时候就是在cmd窗口中使用,应用程序加参数方式。

调试时可以直接在IDE进行传递参数:

在项目上右键鼠标选择“属性”

在选择“调试” --》“启动配置文件”

直接在命令行参数中填写需要传递的参数

参数的扁平化配置(扁平就是把每个参数都展开)

如果在命令行中传递的不是简单是键值对,是比较复杂的对象或数组

对象属性传参格式:

      类名:属性名=值

对象的数组传参格式:

        类名:属性名:数组下标 = 值

 class Proxy { public string Address { get; set; }public string Port { get; set; }public int[] Ids {get;set;}}

比如上面的模型类是一个对象,对象中还有数组,在命令行中就需要使用到扁平化传参数。

传递参数应该是:

环境变量读取参数配置

1.首先也是需要安装Nuget包:

        Microsoft.Extensions.Configuration.EnvironmentVariables

2.然后调用环境变量参数函数:configurationBuilder.AddEnvironmentVariables(),这个函数有无参数和有参数prefix参数重载版本。建议调用prefix版本(带前缀区别环境变量),加载参数时候会忽略prefix参数不会和系统配置环境变量冲突。

    static void Main(string[] args){//创建DI容器对象ServiceCollection services = new ServiceCollection();//将OptionsConfig类注册到容器对象中services.AddScoped<OptionsConfig>();//创建配置构造器ConfigurationBuilder builder = new ConfigurationBuilder();//---------------把原来添加读取JSON文件更换成环境变量配置方式------------------//----------------------------环境变量配置方式-------------------------------builder.AddEnvironmentVariables();//----------------------------------//获得配置层级的根层级IConfigurationRoot confRoot = builder.Build();//添加选项所需的服务,把文件和节点进行绑定// services.AddOptions().Configure<Config>(e=>confRoot.GetSection("proxy").Bind(e));//使用Bind 需要安装 Microsoft.Extensions.Configuration.Binder 包IServiceCollection serviceCollection = services.AddOptions().Configure<Config>(e=>confRoot.Bind(e));using (var sp =services.BuildServiceProvider()) {OptionsConfig config = sp.GetRequiredService<OptionsConfig>();config.Test();}Console.ReadKey();}

3.设置环境变量键值对:

ide调试参数配置:

部署环境,需要在 ”我的电脑” --》属性--》高级--》环境变量中进行配置

开发自定义配置步骤

1.自己开发类需要实现IConfigurationProvider接口

       实现 IConfigurationProvider的类有 ConfigurationProvider 和FileConfigurationProvider,重写Load方法,把数据扁平化设置到Data属性中即可。

2.在开发一个实现IConfigurationSource接口的类。读取文件可以继承类 FileConfigurationSource在重写Build方法中返回上面的ConfigurationProvider对象。

3.然后把ConfigurationSource对象加入到IConfigurationBuilder中 ,configurationBuilder.Add(new ConfigurationSource())

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

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

相关文章

kafka的消费者负载均衡机制

Kafka 的消费者负载均衡机制是保证消息高效消费的核心设计&#xff0c;通过将分区合理分配给消费者组内的消费者&#xff0c;实现并行处理和负载均衡。以下从核心概念、分配策略、重平衡机制等方面详细讲解。一、核心概念理解消费者负载均衡前&#xff0c;需明确三个关键概念&a…

腾讯云edges on部署pages

腾讯云edges on部署pages适用场景部署方式官方文档 适用场景 Next.js Hexo 以及用React Vue等现代前端框架构建的单页应用全栈项目开发 通过Pages Function KV等能力 实现轻量化的动态服务快速部署与迭代 通过Github等代码管理平台集成 每次代码提交时自动构建和部署网站 注…

SpringAI入门及浅实践,实战 Spring‎ AI 调用大模型、提示词工程、对话记忆、Adv‎isor 的使用

上一次写AI学习笔记已经好久之前了&#xff0c;温习温习&#xff0c;这一章讲讲关于Spring‎ AI 调用大模型、对话记忆、Adv‎isor、结构化输出、自定义对话记忆‍、Prompt 模板的相关知识点。 快速跳转到你感兴趣的地方一、提示词工程&#xff08;Prompt&#xff09;1. 基本概…

对抗攻击-知识点

文章目录自然图像往往靠近机器学习分类器学习到的决策边界&#xff08;decision boundaries&#xff09;。正交方向--改变某一个不影响其它的特征降采样&#xff08;Feature Downsampling&#xff09;通过黑盒攻击的持续挑战&#xff0c;我们才能构建真正安全可靠的智能系统DCT…

7.26 作业

一、实验要求及其拓扑图&#xff1a; 本次实验拓扑图&#xff1a; 二、实验IP地址划分&#xff1a; 1. 公网地址&#xff08;R5 作为 ISP&#xff0c;使用公网地址&#xff09;&#xff1a; R1 与 R5 之间接口&#xff1a;15.1.1.0/24&#xff0c;R1 侧为 15.1.1…

Kafka运维实战 14 - kafka消费者组消费进度(Lag)深入理解【实战】

目录什么是消费者 Lag举例说明&#xff1a;Lag 的意义&#xff1a;Lag 监控和查询kafka-consumer-groups基本语法常用命令示例1. 查看单个消费者组的详细信息&#xff08;最常用&#xff09;2. 列出所有消费者组&#xff08;只显示名称&#xff09;3. 列出所有消费者组&#xf…

设计模式(十三)结构型:代理模式详解

设计模式&#xff08;十三&#xff09;结构型&#xff1a;代理模式详解代理模式&#xff08;Proxy Pattern&#xff09;是 GoF 23 种设计模式中的结构型模式之一&#xff0c;其核心价值在于为其他对象提供一种间接访问的机制&#xff0c;以控制对原始对象的访问。它通过引入一个…

24点数学游戏(穷举法求解表达式)

摘要本毕业设计旨在利用MATLAB技术实现一个24点数学游戏&#xff0c;采用穷举法求解所有可能的表达式组合。通过全排列数字、枚举运算符及括号位置&#xff0c;结合递归回溯算法&#xff0c;系统能够高效地搜索所有可能的运算路径&#xff0c;并验证结果是否为24。实验结果表明…

【web应用】如何进行前后端调试Debug? + 前端JavaScript调试Debug?

文章目录一、前后端&#xff1a;后端以Debug模式运行后端项目&#xff0c;打断点二、前后端&#xff1a;前端项目在浏览器中调试三、单独前端&#xff1a;前端JavaScript调试1、控制台输出2、网页调试器中添加断点3、debugger关键字一、前后端&#xff1a;后端以Debug模式运行后…

FreeCAD开发楼梯参数化三维模型和钢格栅

根据楼梯标准图集开发各种楼梯。上行左转&#xff0c;上行右转&#xff0c;对应的栏杆也是配套2种。楼梯总成钢格栅标准里的跨度和承载 扁钢尺寸&#xff0c;轻松切换和修改参数。格栅综合本来格栅上横杆是冷轧扭钢筋&#xff0c;先绘制一个圆柱&#xff0c;再做一个内切正方形…

【AcWing 836题解】合并集合

AcWing 836. 合并集合 【题目描述】 在查看解析之前&#xff0c;先给自己一点时间思考哦&#xff01; 【题解】 并查集是一种用于处理集合合并与查询问题的数据结构&#xff0c;通常支持以下两种操作&#xff1a; Find&#xff1a;查询一个元素所在的集合。 Union&#xff1a…

MySQL锁机制与MVCC原理剖析

在MySQL中&#xff0c;我们使用到了它的各种类锁&#xff1b;按照它的维度&#xff0c;有各种锁 从数据库的操作粒度有&#xff0c;表锁&#xff0c;行锁。从数据库的操作的类型&#xff0c;有读锁和写锁。性能上有乐观锁和悲观锁。 在上一篇文章中的事务隔离级别&#xff0c;需…

C++学习(线程相关)

目录 一、线程库thread 1.使用外部函数 2. 使用类的函数 3. 添加参数 二、线程库 mutex 1.使用lock()方法 2.try_lock()方法 三、线程库lock_guard 四、线程库unique_lock 1.adopt_lock 2.defer_lock() 五、线程库call_once 六、线程库promise & future 七、c…

EPOLLONESHOT 深度解析:Linux epoll 的单次触发机制

EPOLLONESHOT 深度解析&#xff1a;Linux epoll 的单次触发机制 EPOLLONESHOT 是 Linux epoll 接口中的高级事件标志&#xff0c;用于实现精确的事件单次触发控制。以下是其全面技术解析&#xff1a; 核心设计理念 #mermaid-svg-Xg5sCLdddqmKsvKG {font-family:"trebuchet…

深入解析MongoDB分片原理与运维实践指南

深入解析MongoDB分片原理与运维实践指南 技术背景与应用场景 随着互联网业务的高速发展&#xff0c;单节点MongoDB实例在数据量和访问并发上都面临瓶颈。为了解决数据存储容量受限和读写性能下降的问题&#xff0c;MongoDB官方提供了分片&#xff08;Sharding&#xff09;方案&…

基于Django的天气数据可视化分析预测系统

【86-Django】基于Django的天气数据可视化分析预测系统&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介 二、项目界面展示 三、项目视频展示 四、技术架构 五、核心功能模块 六、部署教程一、项目简介 随着全球气候变化和极端天气事件的频发&am…

怎么放大单片机输出电流

单片机作为电子系统的控制核心&#xff0c;其 I/O 口输出电流通常较小&#xff08;一般在 10-20mA 左右&#xff09;&#xff0c;难以直接驱动继电器、电机、大功率 LED 等需要较大工作电流的外设。因此&#xff0c;在实际应用中需通过特定电路放大单片机输出电流&#xff0c;实…

站长百科类网站pbootcms模板(自适应手机端)+利于SEO优化(下载)

站长百科类网站pbootcms模板(自适应手机端)利于SEO优化 模板介绍&#xff1a; PbootCMS内核开发的模板&#xff0c;该模板属于新闻资讯、新闻博客类企业使用&#xff01; 页面简洁简单&#xff0c;容易管理&#xff0c;附带测试数据&#xff01; 模板特点&#xff1a; 1、手工书…

【Golang】Go语言函数

Go语言函数 文章目录Go语言函数Go函数特点一、函数的基本格式定义二、匿名函数三、自执行函数四、闭包函数五、延迟调用Go函数特点 无需声明原型支持不定 变参支持多返回值支持匿名函数和闭包函数也是一种类型&#xff0c;一个函数可以赋值给变量不支持嵌套&#xff0c;一个包…

JAVA算法练习题day2

双指针4.移动零二刷昨天的题&#xff0c;学习了新的数据结构StringBuilder。专为频繁字符串拼接设计的可变字符串类。(https://blog.csdn.net/m0_73941339/article/details/145651287)二刷完昨天的题目&#xff0c;做到这题脑子已经转不动了。做双指针&#xff0c;一般双指针初…