たくさんの記事を読んだ後でも、リポジトリとやり取りするときの Unit of Work パターンの責任についてまだ確信が持てません。
リポジトリは集約ルート エンティティの読み込みと保存を担当するため、次のコード例を検討してください。
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);
}
Unit Of Work Commit コードは、エンティティを DB にマップするために必要なすべての 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();
}
ありがとう、
ジェームズ