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.

  1. Kiedy Ładuję AggregateRoot1, czy powinienem ładować również AggregateRoot2?
  2. czy repozytorium Agregateroot2 powinno być za to odpowiedzialne?
  3. 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.

Author: Chris Harrison, 2011-02-07

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.

 -5
Author: TWith2Sugars,
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

 60
Author: David Masters,
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" /

 0
Author: Flavio Silva,
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