Мне не нравится идея иметь репозитории, передающие изменения в базу данных.
В моем случае xRepository.Add (x) только присоединяет сущность / AR к текущей единице работы.
Чтобы выполнить фактическую фиксацию в db, я вызываю commit для моего uow.
например.
C #
using(var uow = UoW.Begin()
{
var ar1Repo = new Ar1Repository(uow);
var ar1 = ar1Repo.FindById(123); //fetch already persistent entity
var ar1.MakeChangesToAr2();
//both ar1 and ar2 are persistent and known by the UoW
//so no need to add them to the repositories since they
//are already _in_ the repositories
uow.Commit();
}
или:
using(var uow = UoW.Begin()
{
var ar1Repo = new Ar1Repository(uow);
var ar2Repo = new Ar2Repository(uow);
var ar2 = new AR2();
var ar1 = new AR1(AR2);
ar1.MakeChangesToAr2();
//attach the new entities to the uow
ar1Repo.Add(ar1);
ar2Repo.Add(ar2);
uow.Commit();
}
Таким образом, вы можете фиксировать целые партии изменений одновременно, вместо того, чтобы пытаться делать атомарные коммиты для каждой сущности, где у вас могут возникнуть проблемы с фиксацией графов объектов.
Эта идея основана на идеях Джимми Нильссона в его книгеПрименение доменного дизайна и шаблонов.