You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 04:42:23