惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cyberwarzone
Cyberwarzone
V
Vulnerabilities – Threatpost
T
Tenable Blog
Forbes - Security
Forbes - Security
Simon Willison's Weblog
Simon Willison's Weblog
AWS News Blog
AWS News Blog
G
GRAHAM CLULEY
Know Your Adversary
Know Your Adversary
S
Securelist
C
Cybersecurity and Infrastructure Security Agency CISA
Project Zero
Project Zero
C
CXSECURITY Database RSS Feed - CXSecurity.com
V
Visual Studio Blog
WordPress大学
WordPress大学
Latest news
Latest news
K
Kaspersky official blog
T
Tailwind CSS Blog
T
Threat Research - Cisco Blogs
B
Blog RSS Feed
C
Cisco Blogs
博客园 - 聂微东
Martin Fowler
Martin Fowler
T
The Blog of Author Tim Ferriss
小众软件
小众软件
L
LangChain Blog
阮一峰的网络日志
阮一峰的网络日志
L
LINUX DO - 热门话题
Stack Overflow Blog
Stack Overflow Blog
罗磊的独立博客
P
Proofpoint News Feed
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
P
Privacy International News Feed
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
C
CERT Recently Published Vulnerability Notes
Cisco Talos Blog
Cisco Talos Blog
S
SegmentFault 最新的问题
Security Latest
Security Latest
Y
Y Combinator Blog
爱范儿
爱范儿
aimingoo的专栏
aimingoo的专栏
P
Privacy & Cybersecurity Law Blog
L
LINUX DO - 最新话题
月光博客
月光博客
The GitHub Blog
The GitHub Blog
博客园 - 三生石上(FineUI控件)
S
Security Affairs
P
Proofpoint News Feed
D
DataBreaches.Net
有赞技术团队
有赞技术团队
云风的 BLOG
云风的 BLOG

博客园 - BloggerSb

Swagger 文档设置api版本 .Net Core Routing Demo 简化版DbExecutor,将DataTable映射到T属性(支持Dapper风格的匿名参数)。(编程题) 大文件单词统计 (编程题) ASP.NET Core CRUD API 创建 UserController,实现 Get, Post, Put, Delete 方法,使用 EF Core 访问数据库。 (编程题) 设计模式落地:Repository + UnitOfWork + CQRS 完整实现 (编程题) 给定百万级订单表,实现高效分页 + 动态条件查询 + 导出 Excel(避免内存爆炸) (编程题) 实现一个带 CorrelationId、请求日志、异常统一处理的中间件链 (编程题) 异步限流器实现(编程题) 编程题,记录所有接口的执行耗时 .net面试题目 (问答题) 面试高频简答题 Aspose最新Slides破解 HttpContext.User.Identity.IsAuthenticated 为false 关于Cannot resolve scoped service from root provider解决方案 MongoDB用户权限管理,设置密码并连接 mongodb连接字符串 mongodb 使用 MongoDB Compass 创建账号,角色 安装mongodb bootstrap popover 设置悬浮框宽度 div contenteditable="true" 添加placehoder效果 光标自动定位到起始位置contenteditable="true" ,v-html绑定内容,div可编辑时,光标移到最前面
.net Core读取配置比较
BloggerSb · 2026-04-27 · via 博客园 - BloggerSb
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;

namespace ConfigurationDemo.Controllers;

[ApiController]
[Route("[controller]")]
public class ConfigurationController(IConfiguration configuration) : ControllerBase
{
    [HttpGet]
    [Route("my-key")]
    public ActionResult GetMyKey()
    {
        var myKey = configuration["MyKey"];
        return Ok(myKey);
    }

    [HttpGet]
    [Route("database-configuration")]
    public ActionResult GetDatabaseConfiguration()
    {
        var type = configuration["database:Type"];
        var connectionString = configuration["Database:ConnectionString"];
        return Ok(new { Type = type, ConnectionString = connectionString });
    }

    [HttpGet]
    [Route("database-configuration-with-bind")]
    public ActionResult GetDatabaseConfigurationWithBind()
    {
        var databaseOption = new DatabaseOption();
        // The `SectionName` is defined in the `DatabaseOption` class, which shows the section name in the `appsettings.json` file.
        configuration.GetSection(DatabaseOption.SectionName).Bind(databaseOption);
        // You can also use the code below to achieve the same result
        // configuration.Bind(DatabaseOption.SectionName, databaseOption);
        return Ok(new { databaseOption.Type, databaseOption.ConnectionString });
    }

    [HttpGet]
    [Route("database-configuration-with-generic-type")]
    public ActionResult GetDatabaseConfigurationWithGenericType()
    {
        var databaseOption = configuration.GetSection(DatabaseOption.SectionName).Get<DatabaseOption>();
        return Ok(new { databaseOption?.Type, databaseOption?.ConnectionString });
    }

    [HttpGet]
    [Route("database-configuration-with-ioptions")]
    public ActionResult GetDatabaseConfigurationWithIOptions([FromServices] IOptions<DatabaseOption> options)
    {
        var databaseOption = options.Value;
        return Ok(new { databaseOption.Type, databaseOption.ConnectionString });
    }

    [HttpGet]
    [Route("database-configuration-with-ioptions-snapshot")]
    public ActionResult GetDatabaseConfigurationWithIOptionsSnapshot([FromServices] IOptionsSnapshot<DatabaseOption> options)
    {
        var databaseOption = options.Value;
        return Ok(new { databaseOption.Type, databaseOption.ConnectionString });
    }

    [HttpGet]
    [Route("database-configuration-with-ioptions-monitor")]
    public ActionResult GetDatabaseConfigurationWithIOptionsMonitor([FromServices] IOptionsMonitor<DatabaseOption> options)
    {
        var databaseOption = options.CurrentValue;
        return Ok(new { databaseOption.Type, databaseOption.ConnectionString });
    }

    [HttpGet]
    [Route("database-configuration-with-named-options")]
    public ActionResult GetDatabaseConfigurationWithNamedOptions([FromServices] IOptionsSnapshot<DatabaseOptions> options)
    {
        var systemDatabaseOption = options.Get(DatabaseOptions.SystemDatabaseSectionName);
        var businessDatabaseOption = options.Get(DatabaseOptions.BusinessDatabaseSectionName);
        return Ok(new { SystemDatabaseOption = systemDatabaseOption, BusinessDatabaseOption = businessDatabaseOption });
    }
}

所有读取配置的方式可以分成 3 大类

  1. 原始字典读取(最原始、最不推荐)
  2. 手动绑定到类(手动映射,适合一次性读取)
  3. 依赖注入选项模式(官方推荐、企业级标准)

逐段解释 + 差异对比

 1. 最原始:直接用 IConfiguration["key"] 读取

var myKey = configuration["MyKey"]; 
var type = configuration["database:Type"];

特点

  • 字典一样读配置
  • 层级用 : 分隔
  • 无需定义类
  • 无类型安全,容易写错键名

缺点

  • 硬编码字符串,容易写错
  • 没有智能提示
  • 大型项目极难维护

适用场景

  • 临时、简单、少量配置

2. 手动 Bind 绑定到类

configuration.GetSection("Database").Bind(databaseOption);

特点

  • 把配置自动映射到一个类
  • 有类型安全
  • 还是手动调用,每次都要创建对象

优点

  • 比字典方式强
  • 结构化

缺点

  • 每次都要手动 Bind
  • 不能自动热更新
  • 不适合全局复用配置

3. 泛型绑定 Get<T>()

var databaseOption = configuration.GetSection(...).Get<DatabaseOption>();
  • 简化版 Bind,一行完成映射
  • 仍然是手动读取

优缺点同上

下面是 真正工程化 的方式:

选项模式(IOptions 系列)

4. IOptions<T> —— 单例、启动时读取一次

特点

  • 启动时就读取配置
  • 之后不会变(即使改了 appsettings.json 也不更新)
  • 全局单例

适用场景

  • 程序运行期间不会变的配置
  • 最常用、最简单

5. IOptionsSnapshot<T> —— 作用域内缓存(每次请求重新加载)

特点

  • 每次请求都会重新读取配置
  • 修改配置文件后 下一次请求自动生效
  • 作用域生命周期(Scoped)

适用场景

  • 需要热更新,但不需要实时监听
  • Web API 最常用的热更新方案

6. IOptionsMonitor<T> —— 实时监听、立即更新

特点

  • 实时监听配置文件变化
  • 一改配置,立刻生效,不需要等下次请求
  • 单例
  • 支持监听事件

适用场景

  • 必须实时热更新的配置
  • 后台服务、长时间运行的程序

7. 命名选项 Named Options —— 多套同结构配置

options.Get("SystemDatabase");
options.Get("BusinessDatabase");

特点

  • 一个配置类,多套不同配置
  • 用名字区分
  • 适合多数据库、多环境配置

适用场景

  • 多个数据库
  • 多租户
  • 多环境同结构配置