分享一个 .NET Core 使用选项方式读取配置内容的详细例子

news2024/11/24 23:07:46

iamge

前言

在 .NET Core 中,可以使用选项模式(Options Pattern)来读取和管理应用程序的配置内容。

选项模式通过创建一个 POCO(Plain Old CLR Object)来表示配置选项,并将其注册到依赖注入容器中,方便地在应用程序中访问和使用配置内容,这种方式避免了硬编码和字符串操作,是一种类型安全的访问方式。

而且将配置内容集中管理在一个 POCO 类中,便于维护和修改,降低了配置信息分散的风险。

下面看看 .NET Core 是如何使用选项方式读取配置内容。

Step By Step 步骤

  1. 创建一个 .NET Core Console 项目

  2. 从 Nuget 安装以下包

    Microsoft.Extensions.Configuration
    Microsoft.Extensions.Configuration.Binder
    Microsoft.Extensions.Configuration.Json
    Microsoft.Extensions.DependencyInjection
    Microsoft.Extensions.Options

  3. 添加配置文件 appsettings.json,配置内容参考如下

    {
      "Logging": { "LogLevel": { "Default": "Warning" } },
      "DB": {
    	"DbType": "SQLServer",
    	"ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=TestDB;Trusted_Connection=True;MultipleActiveResultSets=true"
      },
      "Smtp": {
    	"Server": "smtp.youzack.com",
    	"UserName": "zack",
    	"Password": "hello888"
      },
      "AllowedHosts": "*"
    }
    
  4. 创建建对应配置项的两个模型类,即 POCO 类

    public class DbSettings
    {
    	public string DbType { get; set; }
    
    	public string ConnectionString { get; set; }
    }
    
    public class SmtpSettings
    {
    	public string Server { get; set; }
    
    	public string UserName { get; set; }
    
    	public string Password { get; set; }
    }   
    
  5. 创建测试读取配置的 Demo 类(重点看注释

    using Microsoft.Extensions.Options;
    
    class Demo
    {
    	// IOptionsSnapshot<T> 在配置改变后,可以不重新运行程序就读到新的值
    	private readonly IOptionsSnapshot<DbSettings> optDbSettings;
    	private readonly IOptionsSnapshot<SmtpSettings> optSmtpSettings;
    
    	// 构造方法注入 IOptionsSnapshot
    	public Demo(
    		IOptionsSnapshot<DbSettings> optDbSettings,
    		IOptionsSnapshot<SmtpSettings> optSmtpSettings
    		)
    	{
    		this.optDbSettings = optDbSettings;
    		this.optSmtpSettings = optSmtpSettings;
    	}
    
    	public void Test()
    	{
    		var db = optDbSettings.Value;
    		Console.WriteLine($"数据库:{db.DbType},{db.ConnectionString}");
    		var smtp = optSmtpSettings.Value;
    		Console.WriteLine($"Smtp:{smtp.Server},{smtp.UserName},{smtp.Password}");
    	}
    }	
    
  6. 打开 Program.cs,编写读取配置代码(重点看注释

    // 1. 引入依赖注入、配置等命名空间
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.DependencyInjection;
    
    // 2. 读取配置文件
    ConfigurationBuilder configBuilder = new ConfigurationBuilder();
    configBuilder.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);   
    IConfigurationRoot config = configBuilder.Build();
    
    // 3. 创建依赖注入容器
    ServiceCollection services = new ServiceCollection();
    
    // 4.1 选项方式注入配置服务
    services.AddOptions()
    	.Configure<DbSettings>(e => config.GetSection("DB").Bind(e))
    	.Configure<SmtpSettings>(e => config.GetSection("Smtp").Bind(e));
    
    // 4.2 注入读取配置的服务
    services.AddTransient<Demo>();
    
    // 5. 使用
    using (var sp = services.BuildServiceProvider())
    {
    	// 建立了一个无限循环,方便修改配置文件反复测试
    	while (true)
    	{
    		using (var scope = sp.CreateScope())
    		{
    			var spScope = scope.ServiceProvider;
    			var demo = spScope.GetRequiredService<Demo>();
    			demo.Test();
    		}
    		Console.WriteLine("可以改配置啦");
    		Console.ReadKey();
    	}
    }
    

总结

  1. 总的来说,使用选项方式读取配置内容可以提高代码的可读性、维护性和灵活性,使用选项方式读取配置是 .NET Core 中推荐的方式,因为它不仅和依赖注入机制结合得更好,而且它可以实现配置修改后自动刷新,所以使用起来更方便
  2. 除了从 Json 文件读取配置,还可以从命令行、环境变量等不同的源读取
  3. .NET Core 中的配置系统支持 “可覆盖的配置”,也就是我们可以向 ConfigurationBuilder 中注册多个配置提供程序,后添加的配置提供程序可以覆盖先添加的配置提供程序

我是老杨,一个奋斗在一线的资深研发老鸟,让我们一起聊聊技术,聊聊人生。

都看到这了,求个点赞、关注、在看三连呗,感谢支持。

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

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

相关文章

Spring AI探索

Spring AI概述 该Spring AI项目旨在简化包含人工智能功能的应用程序的开发&#xff0c;避免不必要的复杂性。 该项目从著名的 Python 项目&#xff08;例如 LangChain 和 LlamaIndex&#xff09;中汲取灵感&#xff0c;但 Spring AI 并非这些项目的直接移植。该项目的成立基于…

Linux内核编程(五)ioctl驱动编写

本文目录 一、系统层和内核层接口1. ioctl系统层接口2. ioctl内核层接口 二、标准 unlocked_ioctl 接口的命令合成三、代码编程 ioctl 主要用于实现对硬件设备控制类操作&#xff0c;实现 write 和 read 不太好实现的功能。 ioctl 是一个强大的工具&#xff0c;可以用于实现复杂…

​单级高频谐振小放

目录 高频交流等效电路 质量指标 增益 通频带 选择性 高频交流等效电路 质量指标 增益 YL撇是怎么来的。 通频带 选择性

Spark常见的可以优化的点

Shuffle 复用 # 1.以下操作会复用的shuffle结果&#xff0c;只会读一遍数据源 val rdd1 sc.textFile("hdfs://zjyprc-hadoop/tmp/hive-site.xml").flatMap(_.split(" ")).map(x > (x,1)).reduceByKey(_ _).filter(_._2 > 1) rdd1.count() rdd1.fil…

基于dagger平台实现资源位的接口自动化

文章目录 什么是dagger平台&#xff1f;什么是资源位&#xff1f;什么是接口自动化&#xff1f;如何实现接口自动化&#xff1f;内部调用关系基本概念互相引用关系 目录结构具体实现任务&#xff1a;Task用例&#xff1a;Case场景&#xff1a;Scene接口&#xff1a;Api 监控与数…

基于Itô扩散过程的交易策略偏微分方程matlab求解与仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于It扩散过程的交易策略偏微分方程,提出了一种确定It扩散过程。通过根据的第一次通过时间来确定问题在这个过程中&#xff0c;我们推导出交易长度的分布函数和密…

如何通过Outlook大附件插件,加强外发附件的安全性和管控力度?

因邮件的便捷性和普遍性&#xff0c;企业间业务往来通常会采取邮箱业务&#xff0c;沟通使用成本也比较低&#xff0c;但容易出现附件太大无法上传的问题。Outlook大附件插件是为解决邮件系统中附件大小限制问题而开发的一系列工具。 使用邮件发送附件时&#xff0c;可能会遇到…

R调用Taxonkit展示系统发育信息

Introduction TaxonKit是一个用于处理生物分类学数据的命令行工具。 它的主要功能是处理NCBI的生物分类学数据&#xff0c;包括对分类单元&#xff08;如物种、属、科等&#xff09;的查找、分类单元的上下位关系查询、分类单元名称的标准化等。 为了方便R社区用户&#xff0…

QuickLook最强大的C#开源文件预览神器

功能特点&#xff1a; 快速预览&#xff1a;用户只需选中文件并按下空格键&#xff0c;即可立即查看文件内容&#xff0c;无需打开特定应用程序或软件。 多格式支持&#xff1a;QuickLook支持预览几乎所有常见的文件类型&#xff0c;包括但不限于&#xff1a; 图像&#xff1…

【计算机网络】已解决:“‘ping‘ 不是内部或外部命令,也不是可运行的程序或批处理文件”报错

文章目录 一、问题分析背景二、可能出错的原因三、错误代码示例四、正确解决方法与示例五、注意事项 已解决“‘ping’ 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件”报错 一、问题分析背景 在Windows操作系统中&#xff0c;ping 命令是一个常用的网络诊断…

STM32CubeMX配置-外部中断配置

一、简介 MCU为STM32G070&#xff0c;配置为上升沿触发外部中断&#xff0c;在上升沿外部中断回调函数中进行相关操作。 二、外部中断配置 查看规格书中管教描述&#xff0c;找到I/O对应的外部中断线&#xff0c;然后进行如下上升沿触发外部中断配置。 三、生成代码 调用上升沿…

【Linux】进程_6

文章目录 五、进程8. 进程地址空间 未完待续 五、进程 8. 进程地址空间 上图可能很多人都看过了&#xff0c;这里再来验证一下&#xff1a; 验证位置&#xff1a; 验证堆栈的生长方向&#xff1a; 在上面的空间布局图中&#xff0c;有一个疑问&#xff0c;画的空间是 内存…

【探索Linux】P.34(HTTPS协议)

阅读导航 引言一、HTTPS是什么1. 什么是"加密"2. 为什么要加密3. 常见的加密方式&#xff08;1&#xff09;对称加密&#xff08;2&#xff09;非对称加密 二、证书认证1. CA认证 三、HTTPS的加密底层原理✅非对称加密对称加密证书认证 温馨提示 引言 在上一篇文章中…

Ubuntu 22.04 解决 firefox 中文界面乱码

问题复现 在为Ubuntu 22.04 Server安装完整的GNOME 42.01桌面后&#xff0c;将桌面语言设置为中文时&#xff0c;打开Firefox可能会出现中文乱码的问题。经过网上调查发现&#xff0c;这个问题是由Snap软件包引起的。 解决方案 为了避免在Ubuntu 22.04中文模式下的乱码问题…

消息队列-RabbitMQ-消息确认机制

为了保证消息的不丢失&#xff0c;可靠抵达&#xff0c;可以使用事务消息&#xff0c;但是性能会下降250倍&#xff0c;为此引入确认机制。 1.ConfirmCallBack 服务器收到消息就回调 ● 被broker接收到只能表示Message已经到达服务器&#xff0c;并不能保证消息一定会投递到目…

【漏洞复现】红海云eHR PtFjk.mob 任意文件上传漏洞

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…

c++编程(18)——deque的模拟实现(2)容器篇

欢迎来到博主的专栏——c编程 博主ID&#xff1a;代码小豪 文章目录 deque的数据结构deque的构造默认构造填充构造 deque的其他操作deque的插入、删除push_back和push_frontpop_back和pop_frontclear、erase和insert操作 传送门 在上一篇中&#xff0c;我们已经实现了deque最核…

2024/6/16 英语每日一段

Nature has the means--to a degree--to limit the effects of climate change. Intact ecosystems such as forests, grasslands, oceans and peatlands are “carbon sinks”--natural storage systems that remove atmospheric carbon and other greenhouse gases--and are …

【Java03】Java中数组在内存中的机制

1. 内存中的数组 Java中的数组是一种引用类型&#xff0c;数组变量&#xff08;引用&#xff09;和数组元素在内存中是分开的。 Java中的数组变量其实就是指针。 如果想要访问数组元素&#xff0c;只能通过这个数组的引用变量&#xff08;指针&#xff09;来访问。 实际数组对…

华为OD机试 - 多段线数据压缩(Java 2024 D卷 100分)

华为OD机试 2024D卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;D卷C卷A卷B卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测…