Pochodzę ze świata skryptów transakcyjnych i dopiero zaczynam patrzeć na DDD. Nie jestem pewien prawidłowego sposobu zintegrowania projektu DDD z trwałością bazy danych. Oto co mam:
Klasa usługi o nazwie OrganisationService, której interfejs zawiera metody pobierania i zapisywania instancji obiektów domeny Organizacji. Organizacja jest zagregowanym katalogiem głównym i ma z nią związane inne dane: członków i licencje. Baza danych EF6 Najpierw DBContext jest używany w ramach usługi OrganisationService do pobierania jednostek OrganisationDB i powiązanych jednostek MemberDB i LicenseDB. Wszystkie te zostają przekształcone w ich odpowiedniki klasy obiektu domeny, gdy zostaną pobrane przez OrganisationService i załadowane do obiektu domeny Organizacji. Ten obiekt wygląda tak:
public class Organisation
{
public IList<Member> Members { get; set; }
public IList<License> Licenses { get; set; }
}
Nie używam wzorca repozytorium w usłudze OrganisationSer ... Używam samego EF jako repozytorium, ponieważ wydaje się, że EF6 w dużej mierze sprawił, że repozytorium jest teraz zbędne.
Na tym etapie projektowania obiekt domeny Organizacji jest anemiczny: wygląda jak klasa organizacji EF POCO. Klasa OrganisationService przypomina bardzo repozytorium!
Teraz muszę zacząć dodawać logikę. Ta logika obejmuje zarządzanie licencjami organizacji i członkami. Teraz w dniach skryptów transakcyjnych dodawałbym metody do OrganisationService do obsługi tych operacji i wywoływałem repozytorium w celu interakcji z bazą danych, ale w przypadku DDD uważam, że ta logika powinna być zawarta w samym obiekcie domeny Organizacji ...
W tym miejscu nie jestem pewien, co powinienem zrobić: będę musiał zachować te dane z powrotem do bazy danych w ramach logiki. Czy to oznacza, że w tym celu należy użyć DbContext w obiekcie domeny Organizacji? Czy używanie repozytorium / EF w obrębie obiektu domeny jest złą praktyką? Jeśli tak, to gdzie ta upór należy?
public class Organisation
{
public IList<Member> Members { get; set; }
public IList<License> Licenses { get; set; }
public void AddLicensesToOrganisation(IList<License> licensesToAdd)
{
// Do validation/other stuff/
// And now Save to the DB???
using(var context = new EFContext())
{
context.Licenses.Add(...
}
// Add to the Licenses collection in Memory
Licenses.AddRange(licensesToAdd);
}
}
Czy zamiast tego powinienem po prostu mutować obiekt domeny Organizacji w pamięci, a następnie wypychać go z powrotem do OrganisationService w celu utrwalenia? Następnie muszę śledzić, co faktycznie zmieniło się na obiekcie (co EF robi z własnymi POCO! Czuję, że EF to nie tylko zastąpienie repozytorium, ale także warstwa domeny!)
Wszelkie wskazówki tutaj są mile widziane.
źródło
nie znam EF6, ale inne ORM obsługują to w sposób transparentny, więc nie będziesz musiał wyraźnie dodawać licencji do kontekstu, wykryje je podczas zapisywania zmian. Więc metoda będzie ograniczona do
i kod wokół niego
źródło