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

.Net Core配置系统

目录

Json文件配置

读取配置原始方法

绑定读取配置

用法

其他配置提供者

命令行方式配置

扁平化配置

环境变量配置

其他配置源

多配置源的优先级

UserSecrets

注意


  1. 传统Web.config配置的缺点
  2. 为了兼容,仍然可以使用Web.config和ConifgurationManager类,但不推荐
  3. .NET中的配置系统支持丰富的配置源,包括文件(json、xml、ini等)、注册表、环境变量、命令行、Azure Key Vault等,还可以配置自定义配资源。可以跟踪配置的改变,可以按照优先级覆盖。

Json文件配置

  1. 创建一个json文件,文件名随意,比如config.json,设置“如果较新则复制”
  2. NuGet安装Microsoft.Extensions.Configuration和Microsoft.Extensions.Configuration.Json
  3. 编写代码,先用简单的方式读取配置

{
  "name": "ljy",
  "age": "18",
  "proxy": {
    "address": "aa",
    "port": "80"
  }
}

读取配置原始方法
//创建配置构建器实例
ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
//添加JSON配置文件
configurationBuilder.AddJsonFile("config.json", optional: true, reloadOnChange: true);
//构建配置根对象
IConfigurationRoot config = configurationBuilder.Build();
//读取“name”配置项
string name = config["name"];
//读取“proxy:address”配置项
string proxyAddress = config.GetSection("proxy:address").Value;
  • optional:表示文件是否可选,建议optional设置为false,这样写错可及时发现
  • reloadOnChange:表示如果文件修改了,是否重新加载配置
绑定读取配置
  1. 可以绑定一个类,自动完成配置的读取
  2. NuGet安装:Microsoft.Extensions.Configuration.Binder
  3. Server server=configRoot.GetSection("proxy").Get<Server>()
class Program
{static void Main(string[] args){ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();configurationBuilder.AddJsonFile("config.json", optional: true, reloadOnChange: true);IConfigurationRoot configRoot = configurationBuilder.Build();//1//string name = configRoot["name"];//Console.WriteLine($"name={name}");//string address = configRoot.GetSection("proxy:address").Value;//Console.WriteLine($"address={address}");//2//Proxy proxy = configRoot.GetSection("proxy").Get<Proxy>();//Console.WriteLine($"{proxy.Address},{proxy.Port}");//3Config config =configRoot.Get<Config>();Console.WriteLine(config.Name);Console.WriteLine(config.Proxy.Address);}
}
class Config
{public string Name { get; set; }public int Age { get; set; }public Proxy Proxy { get; set; }
}
class Proxy
{public string Address { get; set; }public int Port { get; set; }
}
用法
  1. 推荐使用选项方式读取,和DI结合更好,且更好利用“reloadonchange”机制
  2. Nuget安装:Microsoft.Extensions.OptionsMicrosoft.Extensions.Configuration.BinderMicrosoft.Extensions.ConfigurationMicrosoft.Extensions.Configuration.Json
  3. 读取配置的时候,DI要声明IOptions<T>、IOptionsMonitor<T>、IOptionsSnapshot<T>等类型。IOptions<T>不会读取到新的值;和IOptionsMonitor相比,IOptionsSnapshot会在同一个范围内(比如ASP.NET Core一个请求中)保持一致。建议用IOptionsSnapshot
class Program
{static void Main(string[] args){ServiceCollection services = new ServiceCollection();services.AddScoped<TestController>();services.AddScoped<Test2>();ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();configurationBuilder.AddJsonFile("config.json", optional: true, reloadOnChange: true);IConfigurationRoot configRoot = configurationBuilder.Build();//使用services.AddOptions()方法将选项框架注册到服务容器中,Configure<Config>方法来配置Config类的实例。configRoot.Bind(e)是将配置根绑定到Config类的实例上,这样就可以从配置文件中读取相应的配置值并填充到Config类的属性中services.AddOptions().Configure<Config>(e => configRoot.Bind(e)).Configure<Proxy>(e => configRoot.GetSection("proxy").Bind(e));using (var sp = services.BuildServiceProvider()){var c = sp.GetRequiredService<TestController>();c.Test();var c2 = sp.GetRequiredService<Test2>();c2.Test();}}
}class Config
{public string Name { get; set; }public int Age { get; set; }public Proxy Proxy { get; set; }
}class Proxy
{public string Address { get; set; }public int Port { get; set; }
}class TestController
{private readonly IOptionsSnapshot<Config> optConfig;public TestController(IOptionsSnapshot<Config> optConfig){this.optConfig = optConfig;}public void Test(){Console.WriteLine(optConfig.Value.Age);Console.WriteLine(optConfig.Value.Proxy.Port);}
}class Test2
{private readonly IOptionsSnapshot<Proxy> optProxy;public Test2(IOptionsSnapshot<Proxy> optProxy){this.optProxy = optProxy;}public void Test(){Console.WriteLine(optProxy.Value.Address);}
}

其他配置提供者

命令行方式配置

  1. 配置框架还支持从命令行参数、环境变量等地方读取
  2. NuGet安装:Microsoft.Extensions.Configuration.CommandLine
  3. configBuilder.AddCommandLine(args)
  4. 参数支持多种格式,比如:server=127.0.0.1、--server=127.0.0.1、--server 127.0.0.1(注意在键值之间加空格)、/server=127.0.0.1、/server 127.0.0.1(注意在键值之间加空格)。格式不能混用
  5. 调试的时候,VS中简化命令行传参数的方法
//json文件读取配置服务
configurationBuilder.AddJsonFile("config.json", optional: true, reloadOnChange: true);
//命令行读取配置服务
configurationBuilder.AddCommandLine(args);
//环境变量读取配置服务
configurationBuilder.AddEnvironmentVariables();

扁平化配置

对于环境变量、命令行等简单的键值对结构,如果想要进行复杂结构的配置,需要进行“扁平化处理”。对于配置的名字需要采用“层级配置”。例如:a:b:c。对于数组这样配置:a:b:c:0、a:b:c:1、a:b:c:2。

环境变量配置

  1. NuGet安装:Microsoft.Extensions.Configuration.EnvironmentVariables
  2. configurationBuilder.AddEnvironmentVariables()
  3. VS中调试时,避免修改系统环境变量,直接在VS中设置环境变量的方法

AddEnvironmentVariables()有无参数和有prefix参数的两个重载版本。无参数版本会把程序相关的所有环境变量都加载进来,由于有可能和系统中已有的环境变量冲突,因此建议用有prefix参数的AddEnvironmentVariables()。读取配置的时候,prefix参数会被忽略。

其他配置源

  1. 还支持ini、xml等格式的配置源,如果相用查询文档即可
  2. 还支持在运行时、调试时加载不同的json文件
  3. 还内置或第三方支持中心化配置服务器,比如使用Apollo、Nacos等开源服务器,或者使用Azure、阿里云等的配置服务

多配置源的优先级

按照注册到ConfigurationBuilder的顺序,后注册的优先级高,如果配置名字重复,用后注册的值

UserSecrets

  1. .NET提供了user-secrets机制,user-secrets的配置不放到源代码中
  2. Nuget安装:Microsoft.Extensions.Configuration.UserSecrets
  3. 在VS项目上点右键【管理用户机密】,编辑这个配置文件。看看这个文件在哪里。会自动在csproj中的UserSecretsld就是文件夹的名字
  4. configBuilder.AddUserSecrets<Program>()
注意
  1. 不能泄露到源码中的配置放到user-secrets即可,不用都放
  2. 一般把user-secrets优先级放到普通json文件之后
  3. 如果开发人员电脑重装系统等原因造成本地的配置文件删除了,就需要重新配置
  4. 并不是生产中的加密,只适用于开发

http://www.mrgr.cn/news/82426.html

相关文章:

  • 推荐系统重排:DPP 多样性算法
  • java基础学习——java泛型
  • 第0章 机器人及自动驾驶SLAM定位方法全解析及入门进阶学习建议
  • 轻量级通信协议 JSON-RPC 2.0 详解
  • Nginx与frp结合实现局域网和公网的双重https服务
  • 如何在Windows / Mac / Android上查看 HEIC 图像
  • U8G2库使用案例(stm32)
  • 计算机网络原理(谢希仁第八版)第4章课后习题答案
  • Java-list均分分割到多个子列表
  • Unity+Hybridclr发布WebGL记录
  • [Hive]七 Hive 内核
  • springboot3+vue项目实践-黑马
  • 大模型WebUI:Gradio全解系列10——Additional Features:补充特性(下)
  • 【开源社区openEuler实践】qemu
  • UML之泛化、特化和继承
  • YOLO11改进 | 卷积模块 | ECCV2024 小波卷积
  • Linux下部署Redis集群 - 一主二从三哨兵模式
  • mysql 事物隔离级别 与mvcc
  • 【go每日一题】golang异常、错误 {源码、实践、总结}
  • 数据挖掘——支持向量机分类器
  • 【sql】CAST(GROUP_CONCAT())实现一对多对象json输出
  • C 实现植物大战僵尸(二)
  • Elasticsearch: 高级搜索
  • UnityRenderStreaming使用记录(四)
  • 鸿蒙HarmonyOS开发:拨打电话、短信服务、网络搜索、蜂窝数据、SIM卡管理、observer订阅管理
  • 《计算机网络A》单选题-复习题库