在閱讀大量文章後,我仍然不確定與存儲庫交互時工作單元模式的職責。工作單元與存儲庫模式之間的相互作用
庫負責加載和保存骨料根實體,所以考慮以下示例代碼:
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();
}
謝謝,
詹姆斯