当前位置: 首页 > news >正文

.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.dtcms.com/a/299316.html

相关文章:

  • 记录和分享抓取的数字货币和大A时序数据
  • 去中心化时代的通信革命:briefing与cpolar技术融合带来的安全范式革新
  • AI代理性能提升实战:LangChain+LangGraph内存管理与上下文优化完整指南
  • 如何创建或查看具有 repo 权限的 GitHub 个人访问令牌(PAT)
  • kafka的消费者负载均衡机制
  • 《人性的弱点》重构【01】
  • Java:采用mybatis+pagehealper优雅的实现分页功能
  • Flutter 提取图像主色调 ColorScheme.fromImageProvider
  • Go 的时间包:理解单调时间与挂钟时间
  • SWC 深入全面讲解
  • 集成学习的相关理论阐述
  • RocketMQ学习系列之——特殊消息类型
  • 塞舌尔公司良好信誉证明Certificate of Good Standing证书的用途
  • 大众化餐饮:把日常过成诗
  • 基于POD和DMD方法的压气机叶片瞬态流场分析与神经网络预测
  • 幸福网咖订座点餐小程序的设计与实现
  • 启动式service
  • Java同步锁性能优化:15个高效实践与深度解析
  • ARM SMMUv3控制器初始化及设备树分析(七)
  • Cgroup 控制组学习(一)
  • org.apache.lucene.search.Query#rewrite(IndexSearcher)过时讲解
  • C程序内存布局详解
  • Linux内核设计与实现 - 第14章 块I/O层
  • Aerospike Java客户端核心API实战指南:从基础操作到高级功能全解析
  • JAVA算法题练习day1
  • 迅为RK3568开发板OpeHarmony学习开发手册1.1-内核移植优化
  • Caffeine 缓存库的常用功能使用介绍
  • 端到端测试:确保Web应用程序的完整性和可靠性
  • Spark-TTS 使用
  • CPU 为什么需要缓存?揭开速度与效率的底层逻辑