在阅读了大量文章后,我仍然不确定与存储库交互时工作单元模式的职责。
存储库负责加载和保存聚合根实体,因此请考虑以下示例代码:
using(IUnitOfWork uow = container.CreateUnitOfWork())
{
Repository<ARoot> roots = container.GetRepository<ARoot>();
ARoot root = root.FindByName("ARoot");
root.Name = "ANewName";
roots.Save(root);
uow.Commit();
}
工作单元接口将使用以下方法定义:
public interface IUnitOfWork
{
void Insert(object);
void Update(object);
void Delete(object);
void Commit();
void Rollback();
}
假设存储库是使用非常简单的 SQL 映射器实现的,因此 FindByName 包含一些直接返回 ARoot 的 SQL,Save 实现看起来像这样:
public void Save(T entity)
{
IUnitOfWork uow = GetUnitOfWork();
// Tell the UOW we are updating this entity
uow.Update(entity);
}
然后,工作单元提交代码将构造所有必需的 SQL 以将实体映射回数据库?
问题2)
如果我将聚合根添加到工作单元中,工作单元是负责持久化根及其子实体,还是应该是存储库的 Save 方法将更改的实体添加到工作单元中?例如
public void Save(T entity)
{
IUnitOfWork uow = GetUnitOfWork();
// Tell the UOW we are updating this entity
uow.Update(entity);
uow.Update(entity.AChildObject);
}
或者......或者
工作单元是否只处理聚合根,并在提交时为其更改集中的每个对象调用存储库 Save 方法,保留 SQL 映射代码以将实体持久存储在存储库中,将第一个代码示例更改为
using(IUnitOfWork uow = container.CreateUnitOfWork())
{
Repository<ARoot> roots = container.GetRepository<ARoot>();
ARoot root = root.FindByName("ARoot");
root.Name = "ANewName";
//roots.Save(root);
uow.Update(root);
// and commit
uow.Commit();
}
谢谢,
詹姆士