ASP.NET Core 3.1类库项目中如何获取数据库连接字符串
ASP.NET Core独立类库(DB First模式)读取appsettings.json连接字符串可行方案
核心原则:类库作为被依赖的组件,本身不应该承担配置读取的职责,配置加载、数据库连接配置的逻辑应该放在宿主Web API项目中完成,类库只需要接收注入的配置或已初始化的DbContext实例即可
方案1:主项目统一注册DbContext,类库直接注入使用(最推荐,符合DI规范,无耦合)
这是EF Core DB First开发模式下的标准实现方式,步骤如下:- 数据访问层类库无需编写任何配置读取代码,只保留自动生成的实体类与DbContext,给DbContext新增支持依赖注入的构造函数即可:
public partial class AppDbContext : DbContext { // 供依赖注入使用的构造函数,写在partial类中不会被DB First重新生成的代码覆盖 public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { } // 以下为DB First脚手架自动生成的代码,包含DbSet、OnModelCreating等 public DbSet<Product> Products { get; set; } public DbSet<Order> Orders { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { // 自动生成的表映射配置逻辑 } }提示:把DI用的构造函数单独放在DbContext的partial类文件里,后续重新执行DB First脚手架命令更新模型时,不会覆盖这部分自定义代码,不用每次重新生成都手动改构造函数。
- 在Web API主项目的
Program.cs中,读取appsettings.json里的连接字符串,完成DbContext的服务注册:
var builder = WebApplication.CreateBuilder(args); // 读取ConnectionStrings节点下的DefaultConnection配置,注册DbContext builder.Services.AddDbContext<AppDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")) // 如果用MySQL就换成UseMySql,其他数据库 provider 同理替换即可 ); // 如果数据访问层封装了仓储、服务类,也在这里统一注册生命周期 builder.Services.AddScoped<IProductRepository, ProductRepository>();- 后续在数据访问层的任意类中,直接通过构造函数注入
AppDbContext即可使用,连接字符串已经在主项目初始化时完成注入,类库完全不需要关心配置从哪里来。
方案2:类库通过初始化方法传入配置(适用于类库必须主动获取连接字符串的场景,不推荐)
如果你的类库有特殊逻辑必须直接拿到连接字符串值,不要在类库内部直接读取json文件,通过显式初始化的方式把配置从主项目传入即可:- 给数据访问层类库安装
Microsoft.Extensions.ConfigurationNuget包,编写静态配置类存储连接字符串:
public static class DbConfig { public static string DbConnectionString { get; private set; } public static void SetConnectionString(IConfiguration config) { DbConnectionString = config.GetConnectionString("DefaultConnection") ?? throw new ArgumentNullException("数据库连接字符串未配置"); } }- 在Web API主项目的
Program.cs中,应用构建完成后调用初始化方法,传入配置实例:
var app = builder.Build(); // 给数据访问层传入配置实例 DbConfig.SetConnectionString(app.Configuration);后续在类库中直接读取
DbConfig.DbConnectionString就能拿到配置的连接字符串。- 给数据访问层类库安装
方案3:解决DB First脚手架生成时找不到连接字符串的问题
如果你是执行EF Core脚手架命令生成/更新模型时读不到appsettings里的连接字符串,不需要把连接字符串硬编码在命令里,只要在执行命令时指定启动项目为Web API主项目即可,包管理控制台命令示例:Scaffold-DbContext "Name=DefaultConnection" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Entities -Project 你的数据访问层类库项目名 -StartupProject 你的WebAPI主项目名 -Force加了
-StartupProject参数后,脚手架会自动从指定的Web API项目加载appsettings.json配置,直接读取Name=DefaultConnection对应的连接字符串。
常见踩坑提醒
- 不要在类库中直接写
new ConfigurationBuilder().AddJsonFile("appsettings.json")的逻辑:类库编译后为dll文件,运行时的基础目录是Web API主项目的输出目录,直接写相对路径大概率找不到文件,同时也无法兼容开发、测试、生产多环境的差异化配置文件。 - 不要把连接字符串硬编码在类库代码中,后续部署切换环境时修改成本极高,也存在安全风险。
内容的提问来源于stack exchange,提问作者Ali Baran Gündüz
相关产品推荐
相关产品推荐

