背景
据我了解,工作单元 (UoW) 模式本质上提供了事务语义。换句话说,给定一个由存储库持久化的聚合域,UoW 类允许域的消费者将存储库方法的调用注册到原子操作中。假设我们有:
interface IAggregate<TKey> {
TKey Id { get; }
}
interface IRepository<TEntity, in TKey> where TEntity : IAggregate<TKey> {
TEntity Get(TKey id);
void Save(TEntity entity);
void Remove(TEntity entity);
}
interface IUnitOfWork {
void RegisterSave<TEntity>(TEntity entity);
void RegisterRemove<TEntity>(TEntity entity);
void RegisterUnitOfWork(IUnitOfWork uow);
void Commit();
void Rollback();
}
假设IRepository
使用关系数据库的实现,并且IUnitOfWork.Commit
仅与数据库建立事务并继续为已注册的所有操作调用Save
或Remove
在适当的实例上进行。IRepository
我想说我上面概述的是对聚合根、存储库和 UoW 模式的标准、直接解释(尽管 NHibernate/EF 和所有它们臃肿的荣耀)。
过去,我将聚合根边界的概念解释为,从一个聚合到另一个聚合的引用应该由源聚合上目标聚合的 Id 属性客观化。例如:
class User : IAggregate<int> {
int Id { get; private set; }
}
class Blog : IAggregate<int> {
int Id { get; private set; }
int AuthorUserId { get; set; }
}
问题
鉴于上述关注点的分离和聚合边界的解释,如何为需要在事务上创建聚合并将其存储库生成的 Id 保存在另一个聚合中的消费者提供事务支持?例如,我怎样才能创建一个User
和一个Blog
事务性Blog.UserId
设置为User.Id
?
我想出了一些答案(标记为社区 wiki),但无论如何我都会在这里发布我的问题以征求反馈和更多答案。