在阅读大量文章后,我仍然不确定与存储库交互时工作单元模式的职责。工作单元与存储库模式之间的相互作用
库负责加载和保存骨料根实体,所以考虑以下示例代码:
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 Mapper来实现仓库,所以FindByName包含一些直接返回ARoot的SQL,Save实现看起来像这样:
public void Save(T entity)
{
IUnitOfWork uow = GetUnitOfWork();
// Tell the UOW we are updating this entity
uow.Update(entity);
}
然后,Unit Of Work Commit代码会构造所有必需的SQL以将实体映射回DB中?
问题2)
如果我添加一个聚合根到工作单位,是工作的负责persisiting根的单位,其子enitities,或者应该是仓库的保存方法中添加改变了实体到工作单位?例如
public void Save(T entity)
{
IUnitOfWork uow = GetUnitOfWork();
// Tell the UOW we are updating this entity
uow.Update(entity);
uow.Update(entity.AChildObject);
}
或者...... Alternativly
不工作的单位只与总根处理,并COMMITED时要求其变更集中的每个对象存储库保存方法,保持SQL映射代码坚持该实体在Repository,改变第一代码示例
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();
}
谢谢,
詹姆斯