控制台应用与Blazor中IDbContextFactory的使用问题及优化建议
改进DbContextFactory跨项目复用的方案
你当前通过无参构造函数在类库内部构建IDbContextFactory的方式虽然能运行,但存在几个明显问题:
- 硬编码配置文件路径与名称,限制了配置灵活性(比如控制台应用用不同配置文件名就会出错)
- 每次实例化
SalesAccessService都会重复构建服务容器与配置,造成资源浪费 - 违反依赖倒置原则,类库耦合了具体的配置读取与DI容器构建逻辑,单元测试时难以模拟替换
最优改进方案:让宿主程序统一负责DI配置
类库只专注业务逻辑,将DI配置、连接字符串读取的职责交给宿主应用(Blazor/控制台)处理,保持类库纯净性。
1. 改造类库的SalesAccessService
移除无参构造函数,仅保留依赖注入的构造函数:
/// <summary> /// 数据库访问服务 /// </summary> private readonly IDbContextFactory<SalesContext> _dbContextFactory; /// <summary> /// 依赖注入构造函数 /// </summary> /// <param name="dbContextFactory">数据库上下文工厂</param> public SalesAccessService(IDbContextFactory<SalesContext> dbContextFactory) { _dbContextFactory = dbContextFactory ?? throw new ArgumentNullException(nameof(dbContextFactory)); } public async Task<ClusterReport?> Test() { await using(var db = await _dbContextFactory.CreateDbContextAsync()) { return await db.ClusterReport.FirstOrDefaultAsync(); } }
2. 控制台应用中的DI配置
在控制台入口自行构建服务容器,配置DbContextFactory与SalesAccessService,和Blazor的DI逻辑保持一致:
var configuration = new ConfigurationBuilder() .SetBasePath(AppDomain.CurrentDomain.BaseDirectory) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .Build(); var services = new ServiceCollection(); // 配置DbContextFactory var connString = configuration.GetConnectionString("DefaultConnectionSales") ?? throw new InvalidOperationException("未找到连接字符串DefaultConnectionSales"); services.AddDbContextFactory<SalesContext>(options => options.UseMySQL(connString)); // 注册业务服务 services.AddScoped<SalesAccessService>(); // 使用服务 using var serviceProvider = services.BuildServiceProvider(); using var scope = serviceProvider.CreateScope(); var salesService = scope.ServiceProvider.GetRequiredService<SalesAccessService>(); var result = await salesService.Test(); // 处理查询结果
额外优化建议
- 增加参数校验:在构造函数中对
dbContextFactory做非空校验,避免空引用异常 - 提升配置灵活性:允许宿主传入连接字符串或已配置的
DbContextOptions,进一步降低类库与宿主的耦合 - 优化错误处理:替换直接抛出
Exception的方式,使用更具体的异常类型(如InvalidOperationException),便于调用方精准处理
内容的提问来源于stack exchange,提问作者Niki Gagliardi
相关产品推荐
相关产品推荐

