ASP.NET Core中DbContext池化时如何注入ILogger?
解决ASP.NET Core DbContext池化时注入ILogger的问题
错误原因
DbContext池化(AddDbContextPool)有严格的构造函数要求:上下文类必须只有一个公开构造函数,且该构造函数只能接受DbContextOptions类型的单个参数。你的DatabaseContext构造函数同时接收DbContextOptions和ILogger两个参数,违反了这个规则,因此触发错误。
解决方案
方案一:通过DbContext的服务容器获取ILogger
修改DatabaseContext的构造函数为单参数形式,然后从DbContextOptions关联的服务容器中解析ILogger:
public class DatabaseContext : DbContext { private readonly ILogger<DatabaseContext> _logger; public DatabaseContext(DbContextOptions<DatabaseContext> options) : base(options) { // 从服务容器中获取ILogger实例 _logger = options.ContextOptions.ServiceProvider.GetRequiredService<ILogger<DatabaseContext>>(); } // 示例:在DbContext方法中使用Logger public void ExecuteDbOperation() { _logger.LogInformation("开始执行数据库操作"); } }
方案二:在需要时动态解析Logger
如果不需要在构造阶段初始化Logger,也可以在具体业务方法中临时从DbContext的ServiceProvider属性获取:
public class DatabaseContext : DbContext { public DatabaseContext(DbContextOptions<DatabaseContext> options) : base(options) { } public void ExecuteDbOperation() { var logger = ServiceProvider.GetRequiredService<ILogger<DatabaseContext>>(); logger.LogInformation("开始执行数据库操作"); } }
保留原池化配置
你的Program.cs中的池化配置无需修改,保持原样即可:
builder.Services.AddDbContextPool<DatabaseContext>((provider, options) => { options.UseSqlServer(appConfiguration.GetConnectionString("DatabaseConnection")) .EnableSensitiveDataLogging() .EnableDetailedErrors(); });
内容的提问来源于stack exchange,提问作者Vorasoda
相关产品推荐
相关产品推荐

