.NET 8 WebAPI无法通过ConfigurationManager读取appsettings.json连接字符串
.NET 8 WebAPI中DbContext读取appsettings.json连接字符串报“对象未实例化”的问题解决
问题描述
基于.NET 8的ASP.NET WebAPI项目中,DbContext硬编码连接字符串时可正常运行:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer("server=.;database=myDb;trusted_connection=true;"); }
但将连接字符串存入入口项目MainAPI的appsettings.json后,在Data.Persistence类库的DbContext中使用ConfigurationManager读取时,报错“对象未实例化”:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { base.OnConfiguring(optionsBuilder); optionsBuilder.UseSqlServer(ConfigurationManager.ConnectionStrings["Yoman"].ConnectionString); }
appsettings.json配置内容:
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "ConnectionStrings": { "Yoman": "server=xxxx;database=Tester;integrated security=true;multipleactiveresultsets=true;" } }
原因分析
- ConfigurationManager适配问题:
ConfigurationManager是传统.NET Framework的配置读取方式,在.NET Core/.NET 8环境下,默认不会自动加载appsettings.json这类配置文件,直接调用会返回null,访问ConnectionString属性时触发空引用异常。 - 类库权限限制:Data.Persistence作为类库项目,本身不会自动加载入口项目MainAPI的appsettings.json配置文件,无法直接读取其中的内容。
- 不符合ASP.NET Core设计理念:.NET 8 WebAPI的配置体系依赖依赖注入(DI),而非直接通过静态类读取配置。
解决方案
方式一:在启动项目中注入DbContext(推荐)
这是符合ASP.NET Core设计规范的做法,将配置管理集中在启动项目,类库通过DI获取配置:
- 在MainAPI项目的
Program.cs中读取连接字符串并注册DbContext:
var builder = WebApplication.CreateBuilder(args); // 从appsettings.json读取指定连接字符串 var connectionString = builder.Configuration.GetConnectionString("Yoman"); // 注册DbContext到DI容器,传入连接字符串 builder.Services.AddDbContext<YourDbContext>(options => options.UseSqlServer(connectionString)); // 其他中间件配置... var app = builder.Build();
- 修改Data.Persistence项目中的DbContext,移除
ConfigurationManager相关代码,仅保留未配置时的默认逻辑(可选):
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { // 仅当外部未配置DbContext时,使用本地硬编码的连接字符串(用于单独测试类库) if (!optionsBuilder.IsConfigured) { optionsBuilder.UseSqlServer("server=.;database=myDb;trusted_connection=true;"); } }
方式二:手动在类库中加载配置(不推荐)
如果必须在DbContext中直接读取配置,可手动加载appsettings.json,但会增加类库与启动项目的耦合度:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { base.OnConfiguring(optionsBuilder); // 构建配置对象,指定入口项目的appsettings.json路径 var config = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .Build(); var connectionString = config.GetConnectionString("Yoman"); optionsBuilder.UseSqlServer(connectionString); }
注意:部署时需确保appsettings.json路径正确,否则会加载失败。
总结
推荐使用方式一,通过DI注入DbContext并传入连接字符串,既符合ASP.NET Core的分层架构设计,也便于后续扩展配置源(如环境变量、密钥管理服务等),无需修改类库代码。
内容的提问来源于stack exchange,提问作者Baba
相关产品推荐
相关产品推荐

