Правильно ли разрешать сущностям вызывать методы хранилища репозитория? - PullRequest
2 голосов
/ 11 ноября 2010

Например, если у меня есть 2 совокупных корня AR1 и AR2, и AR1 каким-то образом обновляет AR2 - как правильно сохранить эти изменения в хранилище? Должен ли AR1 вызывать метод хранилища хранилища?

Ответы [ 2 ]

2 голосов
/ 19 ноября 2010

Мне не нравится идея иметь репозитории, передающие изменения в базу данных.

В моем случае 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();
}

Таким образом, вы можете фиксировать целые партии изменений одновременно, вместо того, чтобы пытаться делать атомарные коммиты для каждой сущности, где у вас могут возникнуть проблемы с фиксацией графов объектов.

Эта идея основана на идеях Джимми Нильссона в его книгеПрименение доменного дизайна и шаблонов.

0 голосов
/ 12 ноября 2010

У меня был бы метод в AR2 с именем Save (). Этот метод создаст экземпляр хранилища для сохранения самого себя. AR1 может затем вызвать метод Save () для AR2, как только он внес изменение.

...