我想在 ASP.NET Core 和 EF Core 中实现工作单元模式。
我的问题是在工作单元构造函数中是否使用
DbContextFactory
或 DbContext
实例。哪种方法更好,为什么?
代码示例 - 使用
DbContextFactory
:
public sealed class UnitOfWork : IUnitOfWork
{
private AppDbContext _dbContext;
public UnitOfWork(IContextFactory contextFactory)
{
_dbContext = contextFactory.DbContext;
}
}
使用
DbContext
:
public sealed class UnitOfWork : IUnitOfWork
{
private AppDbContext _dbContext;
public UnitOfWork(AppDbContext dbContext)
{
_dbContext = dbContext;
}
}
虽然 Entity Framework Core 的
DbContext
可以被视为管理数据库操作上下文中的工作单元,但我想实现自己的工作单元模式来管理功能计划。
如果您不打算使用池化
DbContext
工厂(serices.AddPooledDbContextFactory(options => ...)
),您应该将 DbContext
(或者更好的是从中派生的实际类)注入到您的服务中。
这更容易,因为依赖项注入将在范围结束时完成所有实例化和处置(默认情况下在请求结束)。
如果您打算或计划将来使用
AddPooledDbContextFactory
,您应该使用工厂。但请注意,处理它也是您的任务。为此,您的 IUnitOfWork
也必须实现 IDisposable
public sealed class UnitOfWork : IUnitOfWork, IDisposable
{
private AppDbContext _dbContext;
private bool disposing;
public UnitOfWork(IContextFactory contextFactory)
{
_dbContext = contextFactory.DbContext;
}
public virtual Dispose(bool disposing)
{
if (disposing)
{
_dbContext?.Dispose();
}
}
public sealed void Dispose()
{
GC.SupressFinalizer(this);
Dispose(true);
}
}
保证内存尽快释放。当直接在存储库外部使用
DbContext
时,您应该在处理完它后立即释放它,而不是在请求结束时释放它
using(DbContext dbContext = contextFactory.CreateContext())
{
// Do your DbContext operations here
}
// dbContext is disposed and memory released
...
// Do other work here