【.Net8教程】(一)读取配置文件全面总结

环境:.net8.0

1. 准备条件

先在appsettings.Development.json或appsettings.json添加配置

添加一个DbOption

json 复制代码
{
  "DbOption": {
    "Conn": "foolishsunday@csdn"
  }
}

2.直接读取json配置节点的几种写法

在Main函数中读取json配置

方式一

csharp 复制代码
var conn1 = builder.Configuration["DbOption:Conn"];

方式二

csharp 复制代码
var conn2 = builder.Configuration.GetValue<string>("DbOption:Conn");

方式三

csharp 复制代码
var conn3 = builder.Configuration.GetSection("DbOption").GetSection("Conn").Value;

方式四

csharp 复制代码
var conn4 = builder.Configuration.GetSection("DbOption")["Conn"];

3.转化为类或record类型

定义类

csharp 复制代码
    public class DbOption
    {
        public string Conn { get; set; }
    }

转化

csharp 复制代码
DbOption opt = builder.Configuration.GetSection(nameof(DbOption)).Get<DbOption>();

4.通过注入IConfiguration方式

csharp 复制代码
    [ApiController]
    [Route("[controller]")]
    public class TestController : ControllerBase
    {
        private readonly IConfiguration _configuration;

        public TestController(IConfiguration configuration)
        {
            _configuration = configuration;
        }
        [HttpPost]
        public async Task<IActionResult> GetConfig()
        {
            var conn1 = _configuration["DbOption:Conn"];
            var conn2 = _configuration.GetValue<string>("DbOption:Conn");
            var conn3 = _configuration.GetSection(nameof(DbOption)).GetSection("Conn").Value;
            return Ok();
        }   
    }

5.或通过Options模式(推荐)

写法一

csharp 复制代码
builder.Services.Configure<DbOption>(builder.Configuration.GetSection(nameof(DbOption)));

写法二

csharp 复制代码
builder.Services.AddOptions<DbOption>().Bind(builder.Configuration.GetSection(nameof(DbOption)));

写法三

csharp 复制代码
builder.Services.AddOptions<DbOption>().BindConfiguration(nameof(DbOption));

然后通过注入IOptions、IOptionsMonitor或IOptionsSnapshot获取

csharp 复制代码
    [ApiController]
    [Route("[controller]")]
    public class DemoController : ControllerBase
    {
        private readonly DbOption _dbOption;

        public DemoController(IOptionsSnapshot<DbOption> dbOption)
        {
            _dbOption = dbOption.Value;//注意此处为.Value
        }   
    }

推荐使用IOptionsSnapshot

Options模式有三个接口IOptions、IOptionsMonitor或IOptionsSnapshot

IOption :单例,一旦生成就不会再更改,除非通过代码的方式更改;

OptionsMonitor :也是单例,但是它只要配置有变更,它就会更新,能通过代码的方式更改值;

IOptionsSnapshot :作用域注册,一次请求里值不会变,在配置文件更新的下一次请求,它的值会更新,但是它不能跨范围通过代码的方式更改值,只能在当前范围(请求)内有效

校验

其中写法二与写法三,如果忘记了配置,获取到值为null,是不会报错的。

如果需要在获取到null时报错,则可以添加Validate校(可抛OptionsValidationException异常)

csharp 复制代码
builder.Services.AddOptions<DbOption>().BindConfiguration(nameof(DbOption))
.Validate(option =>
{
    if (string.IsNullOrEmpty(option.Conn)) return false;
    else return true;
});

6. 注意:调试和发布后启动,读取配置文件的区别

1、当启动vs调试时,由于启动的环境是Development,所以读取配置文件会优先读取appsettings.Development.json;如果没有值,才读取appsettings.json的值;

2、但当我们发布程序启动后(如双击.exe启动),则读取的是appsettings.json文件。

此区别可能会造成初学者产生混淆。

相关推荐
海盗12341 小时前
微软技术日报·2026-08-12——Windows 11多通道累积更新推送十余项功能改进;.NET WebSocket DoS紧急修复
windows·microsoft·.net
唐青枫21 小时前
别再手写 args[0]:C#.NET CommandLineParser 命令行工具实战详解
c#·.net
.Peter1 天前
.NET/WPF 程序在部分 Windows 电脑无法保存用户环境变量:使用 DPAPI 实现安全兼容
windows·信息安全·c#·.net·wpf·环境变量·dpapi
MyBili2 天前
游戏报错缺少dll、无法启动?GRLPackage 运行库合集一键修复指南
游戏·.net·directx·运行库·xna·openal·vc++ redis
慧都小妮子2 天前
PDF图片提取总“褪色“?Aspose.PDF 多层级提取能力详解
pdf·c#·.net·图片处理·文档处理·色彩空间
海盗12342 天前
微软技术周报 · 2026-08-10
microsoft·.net
hez20102 天前
.NET 11 Runtime Async 详解
c#·.net·.net core
猿长大人3 天前
C# | Serilog 新手入门
开发语言·c#·.net·log
猿长大人3 天前
C# | Autofac 新手指南:从零理解依赖注入与组件装配
c#·.net·di·依赖注入
半亩码田4 天前
【.NET新特性·第10篇】.NET 10 概览:LTS 版本的全面进化
大数据·.net