DBContextFactory 与 DBContext 的工作单元

问题描述 投票:0回答:1

我想在 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
可以被视为管理数据库操作上下文中的工作单元,但我想实现自己的工作单元模式来管理功能计划。

c# asp.net-core entity-framework-core dbcontext unit-of-work
1个回答
0
投票

如果您不打算使用池化

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
© www.soinside.com 2019 - 2024. All rights reserved.