asp.net-core - 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();
- 创建工作单元(变量 uow)
- 加载所需的存储库
- 加载实体
- 更新东西
- 插入实体
- 将所有内容保存在所有存储库中
使用这种模式,我可以在之前做一些检查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();
. 这会打破一次通话中进行多项业务交易的可能性吗?然而,我确信必须有更多内容,因为每个人都在使用范围?我是否错过了有关模式的某些内容,或者工厂和业务事务的明确开始和结束是否存在缺陷?
解决方案
推荐阅读
- javascript - ajax jquery 错误显示 [object Object]
- python - psycopg2 标识符中的模式名称
- typo3-7.6.x - “新闻迁移”设置
- sql - 如何使用表中的 3 个连接更新数据?
- ios - 圆形菜单 - 仅在单击区域而不只是图标时创建菜单和调用操作
- json - 如何在 Wikidata 中对数据进行 JSON 或 RDF 批量导入?
- database - OAuth2.0的数据库方案
- python - netcdf python的无效语法ncdump
- android - Glide 不从文件加载图像
- mysql - 使用 pyspark 更新 MySQL 表