使用 Asp.net core webapi 集成配置系统,提高程序的灵活和可维护性

image

前言:什么是集成配置系统?

集成配置系统的主要目的是将应用程序的配置信息与代码分离,使得配置信息可以在不需要修改代码的情况下进行更改。这样可以提高应用程序的灵活性和可维护性。

ASP.NET Core 提供了一种灵活的配置系统,可以轻松地将配置信息从不同的来源加载到应用程序中,并且可以根据环境变量、命令行参数、JSON 文件、XML 文件、环境变量等不同来源来管理配置。

本文主要讲解如何在 Asp.net core webapi 中应用集成配置系统

Step By Step 步骤

  1. 创建一个 ASP.NET Core webapi 项目

  2. 在 SQL Server 数据库中手动创建表 T_Configs,用于保存配置信息

    • 表包含Id、Name、Value这3列
    • Id列定义为整数类型的标识列
    • Name列和Value列都定义为字符串类型
    • Name列为配置项的名字
    • Value列为配置项的值
  3. 在T_Configs表中增加两行数据

    1	Redis	{"ConnStr":"127.0.0.1:16379,allowadmin=true"}
    2	Smtp	{"Host":"smtp.example.com", "UserName":"test", "Password":"mypass123"}
    
  4. 安装并启动 Redis

    • 可下载 Redis 便携包,下载后在命令行窗口启动即可
    • 下载地址:https://redis.io/download/
  5. 引用以下 Nuget 包:

    StackExchange.Redis
    System.Data.SqlClient
    Zack.AnyDBConfigProvider

  6. 在项目中创建一个SmtpOptions实体类,对应Smtp的配置值

    public record SmtpOptions
    {
    	public string Host { get; set; }
    	public string UserName { get; set; }
    	public string Password { get; set; }
    }
    
  7. 在项目上右击,选择【管理用户机密】,生成 Secrets.json

    • 可以看到在 .csproj 文件中生成了 UserSecretsId 节点

      <UserSecretsId>29c6a656-872a-40dc-9793-2a9add90e9fe</UserSecretsId>
      
    • Secrets.json 存储在:

      C:\Users\Jacky\AppData\Roaming\Microsoft\UserSecrets\29c6a656-872a-40dc-9793-2a9add90e9fe\secrets.json
      
    • 编写 Secrets.json 内容为:

      {
        "ConnectionStrings": { "configServer": "Server=(localdb)\\mssqllocaldb;Database=TestDB;Trusted_Connection=True;MultipleActiveResultSets=true" }
      }
      
    • 关闭 Secrets.json 文件后,右键重新【管理用户机密】可以再次打开 Secrets.json 文件

  8. 打开 Program.cs,编写代码进行配置系统的初始化(注意,看代码注释

    using StackExchange.Redis;
    using System.Data.SqlClient;
    
    var builder = WebApplication.CreateBuilder(args);
    
    // Add services to the container.
    
    builder.Services.AddControllers();
    // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
    builder.Services.AddEndpointsApiExplorer();
    builder.Services.AddSwaggerGen();
    
    // 1.读取用户机密文件中的sqlserver连接串
    builder.Host.ConfigureAppConfiguration((_, configBuilder) => {
    	string connStr = builder.Configuration.GetConnectionString("configServer");
    	configBuilder.AddDbConfiguration(() => new SqlConnection(connStr));
    });
    
    // 2.采用直接读取builder.Configuration的方式来读取数据库中的配置,并注册服务
    builder.Services.Configure<SmtpOptions>(builder.Configuration.GetSection("Smtp"));
    builder.Services.AddSingleton<IConnectionMultiplexer>(sp => {
    	string connStr = builder.Configuration.GetValue<string>("Redis:ConnStr");
    	return ConnectionMultiplexer.Connect(connStr);
    }); 
    
    var app = builder.Build();
    
    // Configure the HTTP request pipeline.
    if (app.Environment.IsDevelopment())
    {
    	app.UseSwagger();
    	app.UseSwaggerUI();
    }
    
    app.UseHttpsRedirection();
    
    app.UseAuthorization();
    
    app.MapControllers();
    
    app.Run();
    
  9. 在控制器中通过构造方法注入获取SmtpOptions和Redis连接对象

    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.Options;
    using StackExchange.Redis;
    
    namespace 配置系统集成1.Controllers
    {
    	[ApiController]
    	[Route("[controller]/[action]")]
    	public class HomeController : ControllerBase
    	{
    		private readonly IOptionsSnapshot<SmtpOptions> smtpOptions;
    		private readonly IConnectionMultiplexer connMultiplexer;
    
    		// 通过构造方法注入获取SmtpOptions和Redis连接对象
    		public HomeController(
    			IOptionsSnapshot<SmtpOptions> smtpOptions,
    			IConnectionMultiplexer connMultiplexer)
    		{
    			this.smtpOptions = smtpOptions;
    			this.connMultiplexer = connMultiplexer;
    		}
    
    		// 读取配置信息,连接 Redis 读取数据
    		[HttpGet]
    		public async Task<string> Index()
    		{
    			var opt = smtpOptions.Value;
    			var timeSpan = connMultiplexer.GetDatabase().Ping();
    			
    			//写入和读取 Key-value
    			var database = connMultiplexer.GetDatabase(1);
    			await database.StringSetAsync("name", "Jacky");
    			string str = await database.StringGetAsync("name");
    
    			return $"Smtp:{opt} timeSpan:{timeSpan} str:{str}";
    		}
    	}
    }
    

扩展

为了简化开发,在ASP.NET Core项目中,WebApplication类的CreateBuilder方法会按照下面的顺序来提供默认的配置:

  1. 加载现有的IConfiguration。
  2. 加载项目根目录下的appsettings.json
  3. 加载项目根目录下的appsettings.Environment.json,其中Environment代表当前运行环境的名字
  4. 当程序运行在开发环境下,程序会加载“用户机密”配置
  5. 加载环境变量中的配置
  6. 加载命令行中的配置

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++-windows-linux-linuxdeployqt打包QT应用程序

1.windows下的qt5.14 1.1发布&#xff1a;发布这个选项的&#xff0c;也就是左下角改debug为release&#xff0c;设置后&#xff0c;点击编译build会在release中发现exe文件&#xff0c;直接执行exe会报错&#xff1b;缺失各种库。 QT命令行 要用Qt的命令行终端执行发布命令 …

零基础小白如何自学sql?

学习SQL对于数据分析和处理来说非常重要。SQL是一种强大的工具&#xff0c;可以帮助你与数据库沟通&#xff0c;提取&#xff0c;整理和理解数据。 以下是一些学习SQL的建议&#xff1a; 01 前期&#xff1a;SQL数据库学习 了解SQL的基本概念&#xff1a;首先&#xff0c;你…

亚信安慧AntDB超融合数据库:拓展亿级用户系统的智能化新纪元

在面对亿级用户规模的系统建设需求时&#xff0c;传统数据库往往面临诸多挑战。为了满足多样化的技术要求&#xff0c;项目通常需要倚赖多套技术体系&#xff0c;例如&#xff0c;一套关系型数据库用于元数据管理和标签化管理&#xff0c;另一套则专注于非结构化文件的处理。这…

Spark原理——总体介绍

总体介绍 编写小案例 &#xff08;wordcount&#xff09; Test def wordCount(): Unit {// 1. 创建 sc 对象val conf new SparkConf().setMaster("local[6]").setAppName("wordCount_source")val sc new SparkContext(conf)// 2. 创建数据集val textRDD…

【2023 - 探索】博0到博1,游戏新地图的探索日志

【2023 - 探索】博0到博1&#xff0c;游戏新地图的探索日志 写在最前面CSDN探索日志2023的探险 探索日志年终回顾探索 冒险回顾实习6月开始跟着老师做科研年中的一些其他事情9月开始上课开学后11月&#xff0c;读者互动 新年展望新年祝福 写在最前面 2023&#xff0c;我解锁了新…

C++ 之LeetCode刷题记录(八)

&#x1f604;&#x1f60a;&#x1f606;&#x1f603;&#x1f604;&#x1f60a;&#x1f606;&#x1f603; 开始cpp刷题之旅&#xff0c;多学多练&#xff0c;尽力而为。 先易后难&#xff0c;先刷简单的。 35. 搜索插入位置 给定一个排序数组和一个目标值&#xff0c;…

Github

文章目录 Github 的作用基本概念创建仓库以及相关介绍创建文件、查看文件信息、编辑程序上传文件搜索文件下载/检出文件 Github 的作用 项目代码托管平台 基本概念 Repository 仓库&#xff0c;用于存放项目代码 *Star 收藏项目&#xff0c;方便下次查看&#xff08;有一百个st…

SpringBoot内嵌Tomcat启动流程

前言 Spring MVC 让开发者不用了解 Servlet 细节&#xff0c;专注于 Controller 编写 API 接口。Spring Boot 更是采用约定大于配置的设计思想&#xff0c;通过内嵌 Tomcat 的方式让开发者可以快速构建并部署一个 Web 应用。怎么做到的呢&#xff1f; Tomcat启动方式 早期的…

Java 数据结构篇-实现 AVL 树的核心方法

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 AVL 树的说明 2.0 AVL 树的成员变量及其构造方法 3.0 实现 AVL 树的核心方法 3.1 获取当前节点的高度 height(AVLNode node) 3.2 更新当前节点的高度 updateHeig…

软件安全测评需要关注哪些?湖南CMA、CNAS软件测试公司推荐

在当今信息化的社会&#xff0c;软件安全问题日益凸显&#xff0c;给个人和企业的数据安全造成了极大的威胁。为了保障软件的安全性&#xff0c;软件安全测评应运而生。 软件安全测评是通过对软件系统的评估&#xff0c;发现其中存在的安全漏洞和风险&#xff0c;为软件的开发…

大模型 RAG 问答技术架构及核心模块盘点:从 Embedding、prompt-embedding 到 Reranker

对于RAG而言&#xff0c;2023年已经出现了很多工作&#xff0c;草台班子有了一堆&#xff0c;架构也初步走通&#xff0c;2024年应该会围绕搜索增强做更多的优化工作。 因此我们今天来系统回顾下RAG中的模块&#xff0c;包括一些架构&#xff0c;文本嵌入embedding等&#xff…

MATLAB根据数据拟合曲线

MATLAB根据数据拟合曲线 MATLAB根据数据拟合曲线视频观看 MATLAB根据数据拟合曲线 x1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,6…

深入浅出Android dmabuf_dump工具

dmabuf是什么&#xff1f; 可以参考我之前写的一篇文章&#xff0c;在这篇文章中有介绍dma_buf&#xff1a;BufferManager_驱动的buffermanager-CSDN博客 dmabuf_dump工具介绍(基于Android 14) dmabuf_dump是一个可执行文件&#xff0c;接收参数调用libdmabufinfo.a的接口完成…

C#,入门教程(15)——类(class)的基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(14)——字符串与其他数据类型的转换https://blog.csdn.net/beijinghorn/article/details/124004562 物以类聚&#xff0c;凡物必类。 类的使用&#xff0c;须遵循几个简单的原则&#xff1a; &#xff08;1&#xff09;能类则类&a…

宏集案例丨宏集PC Runtime软件助推食品行业生产线数字化革新

来源&#xff1a;宏集科技 工业物联网 宏集案例丨宏集PC Runtime软件助推食品行业生产线数字化革新 原文链接&#xff1a;https://mp.weixin.qq.com/s/DwzVzifUiidNr-FT3Zfzpg 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; 01 前言 近年来&#xff0c;中国食品行业…

想进入游戏开发领域,应该先学习C++编程还是C#编程?

想进入游戏开发领域&#xff0c;应该先学习C编程还是C#编程&#xff1f; 当你决心踏入游戏开发者的行列时&#xff0c;最先迎接你的将是引擎的选择。引擎是游戏的心脏&#xff0c;所有精彩的画面和内容都是脉脉游戏血液从引擎中流淌而出。Unity、Unreal Engine、Cocos等引擎盛…

牛客字符串

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;…

存储卷(数据卷)—主要是nfs方式挂载

1、定义 容器内的目录和宿主机的目录进行挂载 容器在系统上的生命周期是短暂的&#xff0c;一旦容器被删除&#xff0c;数据会丢失。k8s基于控制器创建的pod&#xff0c;delete相当于重启&#xff0c;容器的状态会恢复到原始状态。一旦回到原始状态&#xff0c;后天编辑的文件…

二叉树的层序遍历(C++详解)

文章目录 写在前面解题思路具体做法 写在前面 本篇文章使用C实现了二叉树的层序遍历。在实现二叉树层序遍历时&#xff0c;一般情况下&#xff0c;大家可能直接输出遍历结果。然而&#xff0c;在解决在线评测&#xff08;OJ&#xff09;问题时&#xff0c;有时要求将每一层的遍…

这7个设计素材网站太好用了,特别是第一款!

网页设计师在使用网页设计素材时&#xff0c;会优先考虑那些免费优质的网页设计素材网站。找到一个免费优质的网页设计素材网站并不容易。有些网站要么需要开设材料网站的会员&#xff0c;要么设计素材质量差。即时设计整理总结了 7 个免费的网页设计素材网站&#xff0c;对 “…