使用 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-valuevar 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. 加载命令行中的配置

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

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

相关文章

Flink构造宽表实时入库案例介绍

1. 安装包准备 Flink 1.15.4 安装包 Flink cdc的mysql连接器 Flink sql的sdb连接器 MySQL驱动 SDB驱动 Flink jdbc的mysql连接器 2. 入库流程图 3. Flink安装部署 上传Flink压缩包到服务器&#xff0c;并解压 tar -zxvf flink-1.14.5-bin-scala_2.11.tgz -C /opt/ 复…

显示器新赛道Type-C接口

如果把主机比作大脑&#xff0c;那显示器就是眼睛&#xff0c;没有眼睛&#xff0c;大脑再强大也发挥不出效果&#xff0c;所以显示器作为电脑最重要的输出设备&#xff0c;有着举足轻重的地位&#xff0c;可以说在生活中处处都有显示器的影子。其实显示器的历史也是科技发展史…

python第三节:Str字符串类型(3)

str.index(sub[, start[, end]]) 类似于 find()&#xff0c;但在找不到子字符串时会引发 ValueError。 例子&#xff1a; str1 my name is jack!print(str1.index(i))print(str1.index(b)) 结果&#xff1a; Traceback (most recent call last): File "D:/pythonPro…

涛思数据获评北京市“专精特新”中小企业

众所周知&#xff0c;“专精特新”企业是国家引导中小企业增强自主创新能力和核心竞争力&#xff0c;不断提高中小企业发展质量和水平而实施的重大工程&#xff0c;旨在支持企业走专精特新发展之路&#xff0c;更好地促进企业高质量发展&#xff0c;也成为各领域产业链供应的关…

YOLOv8 Ultralytics:使用Ultralytics框架进行定向边界框对象检测

YOLOv8 Ultralytics&#xff1a;使用Ultralytics框架进行定向边界框对象检测 前言相关介绍前提条件实验环境安装环境项目地址LinuxWindows 使用Ultralytics框架进行定向边界框对象检测参考文献 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精…

mysql 索引优化查询

MySQL的索引可以提高数据库查询性能。下面是一些常用的MySQL索引优化技巧&#xff1a; 创建合适的索引&#xff1a;根据查询条件选择合适的列作为索引&#xff0c;并确保这些索引在WHERE子句中被使用到。 示例代码&#xff1a;CREATE INDEX idx_name ON table_name (column_nam…

【设计模式】02-SOLID 设计原则

面向对象编程&#xff08;OOP&#xff09;是一种广泛应用的编程范式&#xff0c;它鼓励开发者通过对象来模拟现实世界。为了提高面向对象设计&#xff08;OOD&#xff09;的质量和可维护性&#xff0c;Robert C. Martin提出了 SOLID 原则&#xff0c;这五个原则构成了编写良好、…

Linux 基于 rsync 实现集群分发脚本 xsync

一、rsync 简介 rsync&#xff08;remote synchronize&#xff09;是 Liunx/Unix 下的一个远程数据同步工具。它可以通过 LAN/WAN 快速同步多台主机间的文件和目录&#xff0c;并适当利用 rsync 算法&#xff08;差分编码&#xff09;以减少数据的传输。 rsync 算法并不是每一次…

Redis 常见数据结构以及使用场景分析

Java面试题目录 Redis 常见数据类型以及使用场景分析 Redis中有string、list、hash、set、sorted set、bitmap这6种数据类型。 string可以用来做缓存&#xff0c;分布式锁&#xff0c;计数器等。 list可以实现消息队列&#xff0c;分页查询等。 hash适合存储对象结构。 set 可…

QT问题 ui提升部件时No such file or directory

问题: qt使用ui对部件提升在编译时找不到对应的头文件 出错原因: 因为将部件提升为自定义部件后&#xff0c;在编译时会去默认的路径下去找头文件&#xff0c;而自定义的头文件并不在默认路径文件下&#xff0c;而是在当前目录下&#xff0c;所以这个时候需要自己指定出自…

回归预测 | Matlab实现RIME-HKELM霜冰算法优化混合核极限学习机多变量回归预测

回归预测 | Matlab实现RIME-HKELM霜冰算法优化混合核极限学习机多变量回归预测 目录 回归预测 | Matlab实现RIME-HKELM霜冰算法优化混合核极限学习机多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现RIME-HKELM霜冰算法优化混合核极限学习机多变…

Redis群集-主从、哨兵、集群

redis群集有三种模式&#xff0c;分别是主从同步/复制、哨兵模式、Cluster ●主从复制&#xff1a;主从复制是高可用Redis的基础&#xff0c;哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份&#xff0c;以及对于读操作的负载均衡和简单的故障恢…

priority_queue比较规则

priority_queue比较规则 std::priority_queue实际上就是一个堆&#xff0c;可用于堆排序。 std::priority_queue是C STL中的一个容器适配器&#xff0c;它提供常数时间查找最大元素的功能。默认情况下&#xff0c;它使用元素的<运算符进行排序&#xff08;升序&#xff09…

关于java的面向对象

关于java的面向对象 我们在前面的文章中&#xff0c;学习到了java的基础知识。类&#xff0c;变量&#xff0c;方法&#xff0c;数组等&#xff0c;我们本篇文章来了解一下&#xff0c;java的面向对象&#xff0c;也是java比较核心的存在&#x1f60a; 1、面向过程的思想&…

Redis 发布订阅

目录 1.Redis Unsubscribe 命令 - 指退订给定的频道。简介语法可用版本: > 2.0.0返回值: 这个命令在不同的客户端中有不同的表现。 示例 2.Redis Subscribe 命令 - 订阅给定的一个或多个频道的信息。简介语法可用版本: > 2.0.0返回值: 接收到的信息 示例 3.Redis Pubsub …

【技能---labelme软件的安装及其使用--ubuntu】

文章目录 概要Labelme 是什么&#xff1f;Labelme 能干啥&#xff1f; Ubuntu20.04安装Labelme1.Anaconda的安装2.Labelme的安装3.Labelme的使用 概要 图像检测需要自己的数据集&#xff0c;为此需要对一些数据进行数据标注&#xff0c;这里提供了一种图像的常用标注工具——la…

13. C++ linux命令,查看端口占用,cpu负载,内存占用,如何发送信号给一个进程

linux命令&#xff1a; 查看端口占用&#xff1a;losf -i:端口号 、netstat -tunlp cpu负载: top、uptime 内存占用: free -m、vmstat -s、top 查看磁盘: df、du Linux命令netstat用过吗&#xff1f; Linux如何查看哪些进程占用的内存最多: ps aux tracetoute命令了解吗…

ChatSDK 全双工语音识别库

ChatSDK :是对AIUI的语音SDK封装,套餐费用最低在6万/年iflylib :是对原始msc的语音SDK封装&#xff0c;相对AIUI便宜很多baidulib :是对百度语音SDK封装,百度号称永久免费AIUITools :AIUI网络测试工具-折线图动态测试可持续观测 共同特点&#xff1a;实现了全双工语音识别iat、…

Camunda Spin

Spin 常用于在脚本中解析json或者xml使用&#xff0c;S(variable) 表示构造成Spin对象&#xff0c;通过prop(“属性名”)获取属性值&#xff0c;通过stringValue()、numberValue()、boolValue() 等对类型转换。 repositoryService.createDeployment().name("消息事件流程&…

web第一次作业

题1&#xff1a; <form action"#" method"post"><table><tr><td>用户名&#xff1a;</td><td><input type"text" name"UserName" maxlength"20" size"15"></td>…