Korzeń kruszywa inne korzeń kruszywa
Obecnie dużo pracuję z DDD i mam problem podczas ładowania / pracy na korzeniach agregowanych z innych korzeń agregowanych.
Dla każdego zagregowanego korzenia w moim modelu, mam również repozytorium. Repozytorium jest odpowiedzialne za obsługę operacji trwałości dla roota.
Powiedzmy, że mam dwa zagregowane korzenie, z niektórymi elementami (encjami i obiektami wartości).
Agregateroot1 i Agregateroot2.
Agregateroot1 ma członek podmiotu, który odwołuje się do Agregateroot2.
- Kiedy Ładuję AggregateRoot1, czy powinienem ładować również AggregateRoot2?
- czy repozytorium Agregateroot2 powinno być za to odpowiedzialne?
- Jeśli tak, to czy encja w Agregateroot1 może wywołać repozytorium Agregateroot2 w celu załadowania?
Również, kiedy tworzę powiązanie pomiędzy podmiotem w Agregateroot1 a Agregateroot2, powinno to być zrobione przez podmiot lub przez repozytorium dla Agregateroot2?
Mam nadzieję, że moje pytanie ma sens.[EDIT]
AKTUALNE ROZWIĄZANIE
Z pomocą Twith2Sugars wymyśliłem następujące rozwiązanie:
Jak opisano w pytaniu, korzeń zbiorczy może mieć dzieci, które mają odniesienia do innych korzeni. Podczas przypisywania root2 do jednego z członków root1, repozytorium dla root1 będzie odpowiedzialne za wykrycie tej zmiany i delegowanie jej do repozytorium dla root2.
public void SomeMethod()
{
AggregateRoot1 root1 = AggregateRoot1Repository.GetById("someIdentification");
root1.EntityMember1.AggregateRoot2 = new AggregateRoot2();
AggregateRoot1Repository.Update(root1);
}
public class AggregateRoot1Repository
{
public static void Update(AggregateRoot1 root1)
{
//Implement some mechanism to detect changes to referenced roots
AggregateRoot2Repository.HandleReference(root1.EntityMember1, root1.EntityMember1.AggregateRoot2)
}
}
To tylko prosty przykład, nie zawiera prawa Demeter ani innych najlepszych zasad/praktyk: -)
Dalsze komentarze mile widziane.
3 answers
Być może repozytorium AggregateRoot1 mogłoby wywołać repozytorium AggregateRoot2 podczas konstruowania encji AggregateRoot1.
Nie wydaje mi się, aby to unieważniało ddd, ponieważ repozytoria nadal są odpowiedzialne za pobieranie/tworzenie własnych encji.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-07 09:40:51
Sam byłem w takiej sytuacji i doszedłem do wniosku, że to zbyt duży ból głowy, aby dzieci pracowały w elegancki sposób. Zamiast tego zastanowię się, czy faktycznie musisz odwoływać się do drugiego agregatu jako dziecka pierwszego. Znacznie ułatwia to życie, jeśli po prostu zachowasz odniesienie do identyfikatora agregatu, a nie samego faktycznego agregatu. Następnie, jeśli jest logika domeny, która obejmuje oba Agregaty to można wyodrębnić do usługi domeny i wyglądać coś tak:
public class DomainService
{
private readonly IAggregate1Repository _aggregate1Repository;
private readonly IAggregate2Repository _aggregate2Repository;
public void DoSomething(Guid aggregateID)
{
Aggregate1 agg1 = _aggregate1Repository.Get(aggregateID);
Aggregate2 agg2 = _aggregate2Repository.Get(agg1.Aggregate2ID);
agg1.DoSomething(agg2);
}
}
EDIT:
I naprawdę polecam te artykuły na ten temat: https://vaughnvernon.co/?p=838
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-18 16:50:56
Takie podejście ma pewne problemy. po pierwsze, powinieneś mieć jedno repozytorium dla każdego agregatu i jego gotowe. posiadanie jednego repozytorium, które wywołuje inne, jest złamaniem tej reguły. po drugie, dobrą praktyką w odniesieniu do relacji Agregatowych jest to, że jeden agregat główny powinien komunikować się z innym agregatem głównym za pomocą swojego identyfikatora, nie mając swojego odniesienia. czyniąc to, utrzymujesz każdy agregat niezależnie od innego agregatu. przechowuj odniesienia w agregacie głównym tylko dla klas, które składają się na to samo / align = "left" /
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-11-30 12:51:31