我已经看到使用以下代码实现的工作单元模式:
private HashSet<object> _newEntities = new HashSet<object>();
private HashSet<object> _updatedEntities = new HashSet<object>();
private HashSet<object> _deletedEntities = new HashSet<object>();
然后有一些方法可以将实体添加到这些 HashSet 中的每一个。
在 Commit UnitOfWork 为每个实体创建一些 Mapper 实例,并从一些想象的 Mapper 调用 Insert、Update、Delete 方法。
这种方法对我来说的问题是:Insert、Update、Delete 方法的名称是硬编码的,所以这样的 UnitOfWork 似乎只能执行简单的 CRUD 操作。但是如果我需要以下用法怎么办:
UnitOfWork ouw = new UnitOfWork();
uow.Start();
ARepository arep = new ARepository();
BRepository brep = new BRepository();
arep.DoSomeNonSimpleUpdateHere();
brep.DoSomeNonSimpleDeleteHere();
uow.Commit();
现在三 HashSet 方法失败了,因为我只能为插入、更新、删除操作注册 A 和 B 实体,但我现在需要这些自定义操作。
所以似乎我不能总是堆叠存储库操作,然后用UnitOfWork.Commit();
如何解决这个问题呢?第一个想法是 - 我可以存储方法的地址
arep.DoSomeNonSimpleUpdateHere();
brep.DoSomeNonSimpleDeleteHere();
在 UoW 实例中并执行它们,uow.Commit()
但我还必须存储所有方法参数。这听起来很复杂。
另一个想法是让存储库完全感知 UoW:在DoSomeNonSimpleUpdateHere
我可以检测到有一个 UoW 正在运行,所以我不执行DoSomeNonSimpleUpdateHere
但将操作参数和“待定”状态保存在存储库实例的某个堆栈中(显然我无法保存UoW 中的所有内容,因为 UoW 不应依赖于具体的存储库实现)。然后我在 UoW 实例中注册相关的存储库。当 UoW 调用Commit
时,它会打开一个事务,并为每个待处理的存储库调用诸如 Flush() 之类的东西。现在 Repository 的每个方法都需要一些东西来进行 UoW 检测和操作延迟以供以后使用Commit()
。
所以简短的问题是 - 在 UoW 的多个存储库中注册所有待处理的更改然后Commit()
在单个事务中注册它们的最简单方法是什么?