Słyszałem wiele wzorców repozytoriów, ale zupełnie nie rozumiałem, co tak naprawdę powinno robić repozytorium. Kiedy mówię „co naprawdę powinno zrobić repozytorium”, martwię się głównie o to, jakie metody powinien on zapewnić. Na przykład, czy repozytorium naprawdę powinno zapewniać metody CRUD, czy powinno zapewniać jakąś inną metodę?
Mam na myśli, czy repozytoria powinny zawierać logikę biznesową, czy powinny po prostu zawierać logikę do komunikowania się z magazynem danych i zarządzania podmiotami, które mają być zapisywane lub ładowane?
Słyszałem również, że repozytoria są jednostkami trwałości agregatów. Ale jak to jest? Nie rozumiem, jak to działa w praktyce. Pomyślałem, że powinniśmy mieć tylko jeden interfejs, IRepository
który zawiera metody CRUD, a następnie dla każdego podmiotu implementacja po prostu zawiera logikę zapisywania i pobierania tego typu z magazynu danych.
źródło
Odpowiedzi:
Cóż, możesz zobaczyć dobry przykład w Spring Data Framework, który jest oparty na koncepcji repozytoriów.
Tam zobaczysz, że repozytoria zajmują się tylko magazynem danych i rzadko zawierają logikę biznesową (jest to zarezerwowane dla warstwy usług). Na przykład, gdy spojrzysz na ich projekt, zobaczysz, że mają interfejs CRUDRepository , który udostępnia metody tworzenia, niszczenia i odzyskiwania jednostek (między innymi). Istnieje również PagingAndSortingRepository, który dodaje dodatkową funkcjonalność do tego, sortowania i stronicowania wyników itp.
Ramy te są więc prawdopodobnie dobrym miejscem do studiowania dobrego projektu repozytorium.
O ile mi wiadomo, wiele koncepcji wdrożonych przez Spring Data Framework pochodzi z doskonałej książki o nazwie Domain-Driven Design: Tackling Complexity in the Heart of Software , książka ta ma całą sekcję poświęconą projektowaniu repozytorium.
Możesz rozważyć jego kopię.
Mały fragment książki wyjaśnia:
źródło
Nie powinien zapewniać ani prostego interfejsu CRUD, ani logiki biznesowej. Pośredniczy między logiką biznesową a bazą danych. Interfejs powinien być logiczny, ale nie powinien wykonywać samej logiki biznesowej, bardziej jak prymitywna logika biznesowa. Przykładowo, masz zamiar zbudować system e-mail, masz użytkowników i wiadomości. Twoje repozytorium zapewniałoby podstawowe operacje CRUD dla użytkowników i wiadomości, ale zapewniałoby także filtrowane widoki wiadomości, takich jak GetUsersNewMessages (użytkownik) lub GetSearchedMessages (użytkownik, searchTerms).
Chodzi o to, że repozytorium ukrywa sposób implementacji pamięci i zapewnia przejrzysty interfejs, który umożliwia szybki elastyczny dostęp do danych. Utrzymywanie operacji na wysokim poziomie pod względem tego, co powinno się zdarzyć, a nie w jaki sposób oznacza to większą elastyczność we wdrażaniu ich w jakikolwiek sposób najlepszy dla bazowego sklepu z podkładami.
źródło