首页 > 解决方案 > ASP.net Core 中的工作单元/DbContext 生命周期

问题描述

我将工作单元模式与存储库结合使用了很多。有趣的是,我发现我使用它的方式与大多数人不同。我有一个工作单元工厂,它创建一个工作单元实例(以实体框架数据库上下文作为支持字段)。这意味着,我可以确定没有任何服务/方法会与其他 DbContext 和更改的实体发生冲突。一个示例如下所示:

        using var uow = _uowFactory.Create();
        var jobNotificationRepo = uow.GetIdRepository<JobNotification>();

        var jobNotification = await jobNotificationRepo.LoadAsync(qry => qry.SingleOrDefaultAsync(f => f.Id == jobNotificationId));
        jobNotification.Status = status;
        jobNotification.NotificationAnswerCode = answerCode;
        await jobNotificationRepo.UpsertAsync(jobNotification);

        await uow.SaveAsync();
  1. 创建工作单元(变量 uow)
  2. 加载所需的存储库
  3. 加载实体
  4. 更新东西
  5. 插入实体
  6. 将所有内容保存在所有存储库中

使用这种模式,我可以在之前做一些检查uow.SaveAsync();,要么保存所有内容,要么什么都不保存(因为我总是将工作单元视为逻辑事务)。现在,有趣的是:即使是微软https://docs.microsoft.com/en-us/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns/infrastructure-persistence-layer-implementation-entity-framework-core(和我发现的几乎所有示例)将 DbContext 和工作单元注册为 Scoped。

我不明白的是:这不会破坏工作单元作为一个逻辑事务的整个目的吗?在上面的示例中,假设我不想保存,因为检查未通过,但另一个服务调用了uow.SaveAsync();. 这会打破一次通话中进行多项业务交易的可能性吗?然而,我确信必须有更多内容,因为每个人都在使用范围?我是否错过了有关模式的某些内容,或者工厂和业务事务的明确开始和结束是否存在缺陷?

标签: asp.net-coreentity-framework-coreunit-of-work

解决方案


推荐阅读