W projektowaniu opartym na domenach warstwa domeny może mieć kilka (tradycyjnych) usług. Na przykład w domenie użytkownika możemy mieć:
- UserFactory, który buduje obiekty użytkownika na różne sposoby
- UserRepository, które jest odpowiedzialne za interakcję z usługami przetrwania w warstwie infrastruktury
Czy usługa użytkownika w warstwie domen jest po prostu mediatorem i / lub fasadą dla tych dwóch usług i warstwy infrastruktury, czy może jest coś więcej?
Odpowiedzi:
Domain services
najlepiej opisują to, czym nie są:Entities
aniAggregate roots
Value objects
Entity
lub jednegoValue object
Przykładem a
Domain service
jestSaga/Process manager
: koordynuje długotrwały proces obejmujący wieleAggregate roots
, możliwych z różnychBounded contexts
.To powiedziawszy, co to jest
Domain service
i jak jest realizowane to dwie ortogonalne rzeczy.Niektóre usługi domenowe, takie jak
UserRepository
(złożone z interfejsu zdefiniowanego wDomain layer
oraz konkretnej implementacji wInfrastructure layer
), mogą być zaimplementowane przy użyciuFacade
wzorca projektowego. Inne usługi domenowe nie są.Nie ma twardej zasady dotyczącej sposobu ich implementacji, oprócz ważnej zasady, że
Domain layer
nie może zależeć od innych warstw (i SOLID ).źródło
Widzę usługi w DDD w wyniku odwrócenia zależności .
Jeśli użyjesz „zwykłych” zależności, kod domeny wywoła bazę danych w celu zapisania lub zapytania do encji lub fabryki, która tworzy encję powiązaną z bazą danych lub usługą zewnętrzną lub jakimś innym kodem infrastruktury.
Ale nie tak powinien wyglądać kod domeny. Kod domeny nie powinien zależeć od kodu infrastruktury. Ponieważ ta zależność utrudnia testowanie i ewentualnie ponowne użycie. Dlatego odwracasz tę zależność. Uzależniasz kod infrastruktury od kodu domeny. Aby to zrobić, musisz wprowadzić abstrakcję. Abstrakcja, która określa, jakie zachowanie kod domeny spodziewa się zaimplementować w infrastrukturze.
A usługi w DDD są tą abstrakcją. W większości przypadków w przypadku kodu domeny usługi te powinny być zwykłymi interfejsami. Implementacja powinna być zawarta w kodzie infrastruktury, który jest zależny od tych interfejsów.
źródło