尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
.NET Core 配置与选项
在现代 .NET Core 开发中配置与选项系统早已脱离了传统 App.config 的单一模式形成了一套支持多源混合、强类型绑定、动态更新、可高度扩展的完整体系。1. 获取配置与选项所有配置的读取、合并、管理都围绕 IConfiguration 对象的 Providers 集合展开系统会把所有注册的配置源统一扁平化管理对外提供一致的访问入口。前置准备步骤新建一个 .NET Core 控制台或 Web 项目在项目根目录添加名为 appsettings.json 的文件。右键点击该文件选择“属性”将“复制到输出目录”设置为“始终复制”避免运行时找不到配置文件。通过 NuGet 包管理器安装两个核心依赖Microsoft.Extensions.Configuration.Json和Microsoft.Extensions.Configuration.Binder。编写基础构建代码创建 ConfigurationBuilder 实例注册 JSON 配置源并构建配置根对象using Microsoft.Extensions.Configuration; // 1. 创建配置构建器 IConfigurationBuilder configBuilder new ConfigurationBuilder(); // 2. 注册JSON配置源reloadOnChange开启后文件修改自动重载 configBuilder.AddJsonFile( path: appsettings.json, optional: false, reloadOnChange: true ); // 3. 构建配置根对象 IConfigurationRoot configRoot configBuilder.Build();IConfiguration 常用方法与属性列表成员名称作用说明代码示例this[string key]索引器直接读写配置键值var siteName configRoot[SiteName];GetSection(string key)获取指定层级的子配置节点支持冒号分隔嵌套路径var dbSection configRoot.GetSection(Database);GetChildren()获取当前节点下的所有子配置项foreach(var child in configRoot.GetChildren())GetReloadToken()获取配置变更通知令牌用于自定义监听逻辑var token configRoot.GetReloadToken();Providers获取所有已注册的配置提供器集合foreach(var provider in configRoot.Providers)Reload()强制重新加载所有配置源的数据configRoot.Reload();2. 使用强类型对象承载配置直接通过字符串键读取配置很容易出现拼写错误、类型转换异常而强类型绑定可以自动把配置映射到普通 POCO 类上实现类型安全的配置访问。步骤与代码在appsettings.json中添加嵌套结构的测试配置{ SiteName: 我的博客站点, MaxPageSize: 50, Database: { ConnectionString: Serverlocalhost;DatabaseBlogDB;, Timeout: 30 } }定义对应结构的普通POCO类不需要继承任何基类public class AppSettings { public string SiteName { get; set; } public int MaxPageSize { get; set; } public DatabaseSettings Database { get; set; } } public class DatabaseSettings { public string ConnectionString { get; set; } public int Timeout { get; set; } }执行自动绑定直接生成完整的强类型配置对象var appSettings new AppSettings(); configRoot.GetSection(AppSettings).Bind(appSettings); // 直接访问强类型属性无需手动类型转换 Console.WriteLine($站点名称{appSettings.SiteName}); Console.WriteLine($数据库连接串{appSettings.Database.ConnectionString});3. 使用环境变量配置源环境变量是容器化、云原生部署中最常用的配置注入方式可以把密钥、连接串等敏感配置和代码文件完全隔离避免敏感信息泄露。步骤与代码首先通过 NuGet 安装Microsoft.Extensions.Configuration.EnvironmentVariables包。在配置构建流程中添加环境变量配置源configBuilder.AddEnvironmentVariables();测试嵌套配置系统会自动把环境变量中的双下划线 __ 转换为配置层级的冒号比如设置环境变量 AppSettings__SiteName生产环境站点程序读取时就会自动映射为 AppSettings:SiteName 配置项环境变量的优先级默认高于 JSON 文件会自动覆盖本地配置。4. 使用命令行配置源命令行配置源适合在应用启动时临时覆盖配置不需要修改任何配置文件非常适合容器启动脚本、临时调试场景。步骤与代码安装 NuGet 包Microsoft.Extensions.Configuration.CommandLine。在配置构建流程中添加命令行配置源同时支持自定义短参数映射// 定义短参数映射比如 -p 对应 --Port var switchMappings new Dictionarystring, string() { [-p] Port, [-e] Environment }; configBuilder.AddCommandLine(args, switchMappings);启动应用时传入参数即可覆盖配置示例启动命令MyApp.exe --Port 8080 --Environment Production# 也可以使用短参数MyApp.exe -p 8080 -e Production5. 配置管理器 ConfigurationManager从 .NET 6 开始新增的 ConfigurationManager 把配置构建、服务托管、环境管理能力整合在一起大幅简化了应用启动流程是现代 .NET 项目的默认配置方式。在默认创建的 .NET 6 Web 项目中你不需要手动创建 ConfigurationBuilder框架已经预初始化好了 ConfigurationManagervar builder WebApplication.CreateBuilder(args); // 这里的 builder.Configuration 就是 ConfigurationManager 实例 // 它已经自动按优先级加载了appsettings.json → appsettings.{环境}.json → 环境变量 → 命令行 var siteName builder.Configuration[AppSettings:SiteName]; // 你可以继续添加自定义配置源 builder.Configuration.AddJsonFile(customConfig.json, optional: true);6. 选项模式选项模式是 .NET Core 官方推荐的最佳实践通过依赖注入把配置托管到服务容器中实现配置与业务逻辑的完全解耦。6.1 将配置绑定Options对象先在项目中引入依赖注入相关包在 Program.cs 中完成注册builder.Services.ConfigureAppSettings( builder.Configuration.GetSection(AppSettings) );在业务服务中通过依赖注入获取选项对象public class BlogService { private readonly AppSettings _settings; public BlogService(IOptionsAppSettings settings) { _settings settings.Value; } public void PrintConfig() { Console.WriteLine(_settings.SiteName); } }6.2 命名选项的使用当需要同一配置类的多组不同配置时命名选项可以避免重复定义相似的配置类// 注册两组不同名称的数据库配置 builder.Services.ConfigureDatabaseSettings(Primary, builder.Configuration.GetSection(Database:Primary)); builder.Services.ConfigureDatabaseSettings(Replica, builder.Configuration.GetSection(Database:Replica)); // 使用时通过名称获取指定配置 public class DbFactoryService { public DbFactoryService(IOptionsSnapshotDatabaseSettings dbOptions) { var primaryDb dbOptions.Get(Primary); var replicaDb dbOptions.Get(Replica); } }6.3 Options内容验证在应用启动阶段就自动验证配置合法性避免运行时才发现配置错误导致崩溃// 先给选项类添加数据注解特性 public class AppSettings { [Required(ErrorMessage 站点名称不能为空)] public string SiteName { get; set; } [Range(10, 100, ErrorMessage 分页大小必须在10-100之间)] public int MaxPageSize { get; set; } } // 注册选项时开启数据注解验证 builder.Services.ConfigureAppSettings(builder.Configuration.GetSection(AppSettings)) .ValidateDataAnnotations();6.4 Options后期配置后期配置会在所有配置源加载完成后最后执行适合补充默认值、联动调整配置builder.Services.PostConfigureAppSettings(options { // 所有配置源加载完成后自动给站点名称加上环境后缀 options.SiteName $ - {builder.Environment.EnvironmentName}; });6.5 IOptionsSnapshotScoped 生命周期的选项快照支持配置热更新同一个请求内配置保持一致新请求自动读取最新配置public class HomeController : Controller { private readonly IOptionsSnapshotAppSettings _snapshotSettings; public HomeController(IOptionsSnapshotAppSettings snapshotSettings) { _snapshotSettings snapshotSettings; } public IActionResult Index() { // 修改appsettings.json后刷新页面就能拿到新配置无需重启应用 return Content(_snapshotSettings.Value.SiteName); } }6.6 IOptionsMonitor单例生命周期的配置监控器可以注册回调监听配置变更事件var app builder.Build(); var monitor app.Services.GetRequiredServiceIOptionsMonitorAppSettings(); // 配置变化时自动触发回调 monitor.OnChange(newSettings { Console.WriteLine($配置已更新新站点名称{newSettings.SiteName}); });7. 设置一个配置中心当应用规模扩展到分布式集群时分散在每台机器的配置文件维护成本极高自定义配置中心可以实现配置的集中管理和实时推送。7.1 什么是配置中心配置中心是独立于业务应用的集中式配置服务所有应用实例统一从服务端拉取配置支持配置的集中修改、版本回溯、灰度发布修改一次配置就能同步到所有节点无需逐个登录服务器修改文件。7.2 ConfigurationSource自定义配置源类用来承载配置中心的连接参数public class CustomConfigSource : IConfigurationSource { public string ServerUrl { get; set; } public string AppId { get; set; } public IConfigurationProvider Build(IConfigurationBuilder builder) { return new CustomConfigProvider(this); } }7.3 ConfigurationProvider核心配置提供器负责从远程配置中心拉取数据public class CustomConfigProvider : ConfigurationProvider { private readonly CustomConfigSource _source; public CustomConfigProvider(CustomConfigSource source) { _source source; } // 重写Load方法从远程接口拉取配置 public override void Load() { using var httpClient new HttpClient(); var json httpClient.GetStringAsync(${_source.ServerUrl}/pull?appId{_source.AppId}).Result; Data JsonSerializer.DeserializeDictionarystring, string(json); } }7.4 配置扩展方法封装扩展方法让自定义配置源接入更简洁public static class CustomConfigExtensions { public static IConfigurationBuilder AddCustomConfigCenter( this IConfigurationBuilder builder, string serverUrl, string appId) { return builder.Add(new CustomConfigSource { ServerUrl serverUrl, AppId appId }); } }接入时只需要一行代码configBuilder.AddCustomConfigCenter(http://localhost:5000/config, MyBlogApp);7.5 配置动态更新HTTP Long Polling方案在配置提供器中加入长轮询逻辑实现配置准实时推送这也是 Nacos、Apollo 等主流配置中心的核心实现方案public class CustomConfigProvider : ConfigurationProvider { private Timer _pollTimer; private string _currentVersion 0; public CustomConfigProvider(CustomConfigSource source) { _source source; // 后台启动长轮询任务 _pollTimer new Timer(StartLongPolling, null, 0, Timeout.Infinite); } private async void StartLongPolling(object state) { using var httpClient new HttpClient(); // 设置90秒长轮询超时和主流配置中心默认超时保持一致 httpClient.Timeout TimeSpan.FromSeconds(90); while(true) { try { // 带着当前版本号发起请求服务端没有新配置就挂起连接 var response await httpClient.GetAsync( ${_source.ServerUrl}/longpoll?appId{_source.AppId}version{_currentVersion} ); if(response.IsSuccessStatusCode) { var configData await response.Content.ReadFromJsonAsyncConfigResponse(); // 配置有更新重新加载 Data configData.Configs; _currentVersion configData.Version; // 触发配置系统重载通知 OnReload(); } } catch(Exception ex) { // 长轮询超时或出错等待1秒后重试 await Task.Delay(1000); } } } }服务端侧的长轮询核心逻辑可以借助 .NET Core 的 Channel 实现配置变更时直接通知等待的请求无需轮询数据库实现准实时推送效果。
RELATED

相关推荐

Python基础技术练习

Python基础技术练习

第一题:新建 practice1.py,用 print() 输出你的姓名、年龄、学校,三行内容(分别用一个 print)分析说明: print() 是输出函数,默认输出结束自动换行。三个独立print语句,分别输出姓名…

📅 2026/10/30 2:29:49
FunASR安装

FunASR安装

在 Windows 上配置和运行 FunASR,最省事的路子是走 Docker 一键部署,或者用现成的整合包‌。下面按不同需求给出对应方案。🐳 方案一:Docker 一键部署(推荐,适合离线转写服务) 这是目前最省心的…

📅 2026/10/30 2:29:49
8、【MOD开发】【骑砍2】跨平台MOD构建环境(八)/:游戏根 bin 与模块 bin——运行程序集的两种归属

8、【MOD开发】【骑砍2】跨平台MOD构建环境(八)/:游戏根 bin 与模块 bin——运行程序集的两种归属

【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除 8、【MOD开发】【骑砍2】跨平台MOD构建环境&am…

📅 2026/10/30 2:29:49
MORE NEWS

更多资讯

📰

Axure原型设计入门:一张图掌握核心操作流程

很多刚接触原型设计的朋友,第一次打开Axure看到满屏的元件库、属性面板和交互面板,第一反应往往是“这玩意儿比写代码还复杂”。我见过太多人装了软件、看了两小时教程,然后默默关掉,转头继续用PPT画方块。问题不在于Axure难&…

📰

安全隔离网闸:物理隔离下的受控数据交换原理与实战配置

1. 安全隔离网闸到底在解决什么问题第一次接触“安全隔离网闸”这个概念,是在一个跨网络数据交换的项目里。当时业务方需要在两套物理隔离的网络之间同步一批文件,开发同学第一反应是“拉根网线不就行了”,运维同学则坚持“绝对不行&#xff…

📰

Transformer自注意力机制:置换不变性与位置编码解析

1. 理解Transformer自注意力的置换不变性当我们说Transformer的自注意力机制是"置换不变"的,本质上是在描述它对输入序列中元素的排列顺序不敏感的特性。想象你面前有一副扑克牌,无论你怎么洗牌(改变顺序),只…

📰

深入解析SQL COUNT函数:从基础语法到性能优化

1. 为什么我们需要深入了解COUNT函数?在日常数据库操作中,COUNT函数可能是最常用的聚合函数之一。但很多人只是停留在"SELECT COUNT(*) FROM table"这样的基础用法上,实际上这个简单的函数背后隐藏着许多值得深究的技术细节。我曾在…

📰

代码签名实战:密钥、时间戳与证书链验证指南

1. 代码签名到底在签什么:先把概念钉死我第一次接触“代码签名”这个词,是在给一个桌面工具做分发的时候。当时打包出来的安装包在别人电脑上双击就被拦下来了,弹窗提示“未知发布者”。我一开始以为是杀毒软件误报,换了几台机器测…

📰

5G毫米波与室内电波传播仿真技术解析

1. 项目背景与核心价值城市与室内电波传播仿真一直是无线通信系统设计中的关键难题。随着5G毫米波频段和物联网设备的普及,传统经验模型在复杂城市场景下的预测误差可达15dB以上。我们团队开发的这套高频电磁场仿真系统,专门针对280MHz-100GHz频段的传播…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬