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

控制台应用与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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 16:05:06