EF Core Code-First多仓储场景:如何让AppSecurity获取宿主项目连接字符串?
解决方案
要让AppSecurity项目自动获取宿主项目的连接字符串,核心是把连接字符串的配置权完全交给宿主项目,AppSecurity仅负责提供DbContext定义,不硬编码或管理连接信息。具体实现步骤如下:
1. 重构AppSecurityDataContext,支持外部配置注入
修改AppSecurityDataContext,移除硬编码的连接字符串,添加基于DbContextOptions的构造函数,让宿主项目能通过配置项传递连接信息:
internal class AppSecurityDataContext : DbContext { // 移除硬编码的_connectionString字段 // 添加接受DbContextOptions的构造函数(EF Core推荐的依赖注入方式) public AppSecurityDataContext(DbContextOptions<AppSecurityDataContext> options) : base(options) { } // 保留无参构造函数(可选,用于Code-First迁移等场景) public AppSecurityDataContext() { } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { // 仅当无外部配置时使用默认连接(可选,也可留空强制宿主配置) if (!optionsBuilder.IsConfigured) { optionsBuilder.UseSqlServer(@"Server=mysite.com;Database=TheLastAppIWorkedOn;User Id=abc1;Password=xyx2;"); } } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<UserEntity>().HasData ( new UserEntity { // Properties set here } ); } }
2. 在宿主项目(如Falcon)中配置并注入AppSecurityDataContext
以WPF项目Falcon为例,使用Microsoft.Extensions.DependencyInjection实现依赖注入,将宿主的连接字符串传递给AppSecurityDataContext:
第一步:用配置文件管理Falcon的连接字符串
移除FalconDataContext中的硬编码连接字符串,添加appsettings.json文件(设置“复制到输出目录”为“如果较新则复制”):
{ "ConnectionStrings": { "FalconDb": "Server=mysite.com;Database=Falcon;User Id=someone;Password=somepwd;", "AppSecurityDb": "Server=mysite.com;Database=TheLastAppIWorkedOn;User Id=abc1;Password=xyx2;" } }
第二步:配置依赖注入容器
在Falcon的启动逻辑(如App.xaml.cs的OnStartup方法)中,注册DbContext并传入对应连接字符串:
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using System.IO; using System.Windows; public partial class App : Application { private IServiceProvider _serviceProvider; protected override void OnStartup(StartupEventArgs e) { var configuration = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json") .Build(); var services = new ServiceCollection(); // 注册Falcon自身的DbContext services.AddDbContext<FalconDataContext>(options => options.UseSqlServer(configuration.GetConnectionString("FalconDb"))); // 注册AppSecurity的DbContext,使用宿主配置的连接字符串 services.AddDbContext<AppSecurityDataContext>(options => options.UseSqlServer(configuration.GetConnectionString("AppSecurityDb"))); // 注册其他业务服务... _serviceProvider = services.BuildServiceProvider(); // 启动主窗口 var mainWindow = _serviceProvider.GetRequiredService<MainWindow>(); mainWindow.Show(); } }
3. 后续项目引用AppSecurity的操作
任何后续项目引用AppSecurity时,只需:
- 在自身配置文件中添加
AppSecurityDb的连接字符串 - 在依赖注入容器中注册
AppSecurityDataContext并传入该连接字符串 - 无需修改AppSecurity的代码,也不需要重新编译AppSecurity
核心优势
- 解耦AppSecurity与连接字符串的依赖,让AppSecurity成为纯业务组件
- 宿主项目完全掌控连接字符串来源(可来自配置文件、环境变量、密钥管理器等)
- 后续扩展或更换宿主时,无需改动AppSecurity代码,降低维护成本
内容的提问来源于stack exchange,提问作者CoderForHire
相关产品推荐
相关产品推荐

