DDD - relacja wiele do wielu

0

hej,
Chciałem spróbować na przykładzie prostej aplikacji stworzyć obiekty domenowe bliższe DDD niż jak zwykle zwykła lista właściwości z pustymi getami i setami.

Mam 3 klaski, Group, Person i Event. Protoptyp tych 3 klas wygląda następujaco:

   public class Group: BaseEntity
   {
      private ISet<Person> _persons = new HashSet<Person>();
      private ISet<Event> _events = new HashSet<Event>();
      public string Name{ get; set; }
      public IEnumerable<Event> Events => _events;
      public IEnumerable<Person> Persons => _persons;

      public void addPerson(string name)
      {
         _persons.Add(new Person(name));
      }

      public void addEvent(DateTime date, IEnumerable<int> ids)
      {
         var event= new Event(date);
         _events.Add(event);
         foreach (var id in ids)
         {
            var person = _persons.FirstOrDefault(p => p.Id == id);
            person?.addToEvent(event);
         }
      }
   }

   public class Event: BaseEntity
   {
      public DateTime Date { get; set; }
      public Group group{ get; set; }
      public Event(DateTime date)
      {
         Date = date;
      }
   }

   public class Person: BaseEntity
   {
      private ISet<Event> _events= new HashSet<Event>();
      public IEnumerable<Event> Events => _events;
      public Group Group{ get; set; }
      public string Name { get; set; }
      public Person(string name)
      {
         Name = name;
      }

      public void addToEvent(Event e)
      {
         _events.Add(e);
      }
   }

Wydarzenie jest przypisane do grupy i do osoby. Grupa i osoba mogą mieć wiele wydarzeń. Dodatkowo osoba jest przypisana do grupy.
Pytanie teraz jak zrobić, żeby z poziomu Person mieć dostęp do wszystkich jego wydarzeń? Normalnie utworzył bym tutaj klasę PersonEvent, bo jedna osoba może mieć wiele wydarzeń i jedno wydarzenie może być przypisane do wielu osób. Jak to w podejściu DDD rozwiązać?

1

A czemu nie możesz mieć po prostu kolekcji Event w Person i kolekcji Person w Event?

No i te publiczne settery to tak słabo do DDD pasują. Rzekłbym wcale.

0
somekind napisał(a):

A czemu nie możesz mieć po prostu kolekcji Event w Person i kolekcji Person w Event?

No i te publiczne settery to tak słabo do DDD pasują. Rzekłbym wcale.

Dzięki za odpowiedź.
Z setterami sprawa jasna, wiem że powinna być tutaj hermetyzacja, po prostu nie doszedłem do teog momentu.

Jeżeli dodam kolekcję Person w Event to nie mapują mi się te klasy na tabele w bazie danych. I z tego co widzę, to aktualne ogranicznie EF Core i bez tabeli klasy łączącej się nie da.

2

Skoro na tym polega Twój problem, to Ty nie tworzysz modelu domeny zgodnie z DDD tylko persistence model dla ORMa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1