Używam podejścia podobnego do DDD dla modułu greenfield istniejącej aplikacji; nie jest to 100% DDD ze względu na architekturę, ale staram się użyć niektórych koncepcji DDD. Mam ograniczony kontekst (myślę, że to właściwy termin - wciąż uczę się o DDD) składający się z dwóch jednostek: Conversation
i Message
. Rozmowa jest korzeniem, ponieważ Wiadomość nie istnieje bez rozmowy, a wszystkie wiadomości w systemie są częścią rozmowy.
Mam ConversationRepository
klasę (chociaż tak naprawdę bardziej przypomina bramę, używam terminu „repozytorium”), który znajduje konwersacje w bazie danych; gdy znajdzie konwersację, tworzy również (za pośrednictwem fabryk) listę wiadomości dla tej konwersacji (udostępnionych jako właściwość). Wydaje się to być prawidłowym sposobem radzenia sobie z różnymi rzeczami, ponieważ wydaje się, że nie ma potrzeby tworzenia pełnowymiarowej MessageRepository
klasy, ponieważ istnieje ona tylko po odzyskaniu konwersacji.
Jednak jeśli chodzi o zapisywanie wiadomości, jest to obowiązkiem ConversationRepository, ponieważ jest to zagregowany katalog główny wiadomości? Mam na myśli to, czy powinienem mieć metodę na ConversationRepository o nazwie powiedzmy, AddMessage
która pobiera komunikat jako parametr i zapisuje go w bazie danych? Czy powinienem mieć osobne repozytorium do wyszukiwania / zapisywania wiadomości? Logiczną rzeczą wydaje się być jedno repozytorium na jednostkę, ale słyszałem również „Jedno repozytorium na kontekst”.
źródło
Można utworzyć ConversationService i wstrzyknąć IConversationRepository i IMessageRepository w jego konstruktora. Używaj repozytoriów do prostych operacji CRUD i usług do wszystkiego innego (buforowanie, zapisywanie logiki itp.)
źródło