IDbContextFactory用于按需创建独立、短生命周期DbContext实例,适用于后台任务、并行操作、非DI环境及需手动控制释放的场景,须用using显式释放。
EF Core 的 IDbContextFactory 是专为**按需创建独立、短生命周期 DbContext 实例**设计的接口,不是用来替代常规依赖注入方式的。它解决的核心问题是:需要在非 DI 环境(如后台线程、命令行工具、定时任务)、或需**并发/并行操作多个 DbContext**(避免线程不安全)、或需**手动控制释放时机**的场景。
以下情况推荐使用工厂模式:
Task.Run、Parallel.ForEachAsync 或 Hangfire 后台任务中创建 DbContextusing 精确释放)在 Program.cs(.NET 6+)中注册即可,生命周期默认为 Singleton:
之后在任意服务中通过构造函数注入使用:
public class OrderService工厂创建的 DbContext **不由 DI 容器管理生命周期**,必须手动释放。最稳妥的方式是配合 using 语句:
注意:
• 不要用 using var context = ... 在异步方法里跨 await 持有(会提前释放);
• 若需多次 await 操作,改用 try/finally 或确保在同一个作用域内完成所有数据库操作再释放。
DbContextFactory ≠ DbContextPool:
CreateDbContext() 都新建一个实例,适合“一次一用”、高并发、隔离性要求强的场景AddDbContextPool):复用已释放的 DbContext 实例,减少 GC 压力,但仍是 Scoped 生命周期,不适合跨线程或长时间持有
再对同一上下文类型注册池化基本上就这些。用对场景,写法简洁,关键是记得自己 Dispose。