.NET 6中如何在DbContext等类中访问secrets.json内的密钥?
.NET 6 中用 Secrets.json 隐藏 DbContext 连接字符串的正确姿势
问题背景
已经在secrets.json里存好数据库连接字符串,不想在DbContext里硬编码,但是对.NET 6的实现方式摸不清,不确定Program.cs的写法,也不知道怎么在DbContext里读取密钥,甚至怀疑自己写的Configuration类有没有必要。
解决步骤
1. 简化Program.cs,正确注册DbContext
不需要单独读取连接字符串再赋值,直接在注册DbContext的时候从配置里拿就行,原来那些多余的变量可以删掉。修改后的Program.cs如下:
using ItunesMVC; using Microsoft.EntityFrameworkCore; var builder = WebApplication.CreateBuilder(args); // 添加MVC控制器和视图服务 builder.Services.AddControllersWithViews(); // 核心:注册DbContext并从配置(含secrets.json)读取连接字符串 builder.Services.AddDbContext<ItunesSearchDBEntities>(options => { var connectionString = builder.Configuration["ConnectionStrings:itunesAppDB"]; options.UseMySql(connectionString, ServerVersion.Parse("8.0.28-mysql")); }); var app = builder.Build(); // 配置HTTP请求管道 if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.Run();
2. 精简DbContext类
DbContext不需要自己读取配置,因为已经通过依赖注入把配置好的Options传进来了。删掉多余的_configuration字段、ConnectionString属性,以及OnConfiguring里的硬编码部分(连那个警告一起消失)。修改后的DbContext代码:
using Microsoft.EntityFrameworkCore; namespace ItunesMVC { public partial class ItunesSearchDBEntities : DbContext { // 只保留接收Options的构造函数 public ItunesSearchDBEntities(DbContextOptions<ItunesSearchDBEntities> options) : base(options) { } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.UseCollation("utf8mb4_0900_ai_ci") .HasCharSet("utf8mb4"); OnModelCreatingPartial(modelBuilder); } partial void OnModelCreatingPartial(ModelBuilder modelBuilder); public DbSet<SearchCount> SearchCounts { get; set; } } }
3. 删掉多余的Configuration类
你写的那个Configuration类完全没必要,直接通过builder.Configuration["ConnectionStrings:itunesAppDB"]就能读取secrets里的连接字符串,省得多写一个类。
4. 确认secrets.json的结构
确保你的secrets.json是这个格式:
{ "ConnectionStrings": { "itunesAppDB": "你的MySQL连接字符串" } }
原理说明
.NET 6的WebApplication.CreateBuilder会自动加载开发环境下的secrets.json,所以builder.Configuration会自动包含这里面的配置项,不需要额外写代码读取。注册DbContext时把连接字符串通过Options注入进去,DbContext直接用构造函数接收就行,完美避开硬编码。
内容的提问来源于stack exchange,提问作者Stephen Aranda
相关产品推荐
相关产品推荐

