Wzór repozytorium Krok po kroku Objaśnienie [zamknięte]

276

Czy ktoś może wyjaśnić mi Wzorzec repozytorium w .NET, krok po kroku, podając bardzo prosty przykład lub wersję demonstracyjną.

Wiem, że to bardzo częste pytanie, ale jak dotąd nie znalazłem zadowalającej odpowiedzi.

Sa Patil
źródło

Odpowiedzi:

199

Podsumowując, opisałbym szerszy wpływ wzoru repozytorium. Pozwala to całemu kodowi na używanie obiektów bez konieczności znajomości sposobu utrwalania obiektów. Cała wiedza na temat trwałości, w tym mapowanie tabel na obiekty, jest bezpiecznie zawarta w repozytorium.

Bardzo często zapytania SQL są rozproszone w bazie kodu, a kiedy przychodzi się dodać kolumnę do tabeli, należy przeszukać pliki kodu, aby spróbować znaleźć użycie tabeli. Wpływ zmiany jest daleko idący.

W przypadku wzorca repozytorium wystarczy zmienić tylko jeden obiekt i jedno repozytorium. Wpływ jest bardzo mały.

Być może pomogłoby zastanowić się, dlaczego użyjesz wzorca repozytorium. Oto kilka powodów:

  • Masz jedno miejsce do wprowadzania zmian w dostępie do danych

  • Masz jedno miejsce odpowiedzialne za zestaw tabel (zwykle)

  • Łatwo zastąpić repozytorium fałszywą implementacją do testowania - więc nie musisz mieć bazy danych dostępnej dla testów jednostkowych

Są też inne korzyści, na przykład, jeśli korzystałeś z MySQL i chciałeś przejść na SQL Server - ale tak naprawdę nigdy nie widziałem tego w praktyce!

Fenton
źródło
28
Przełączam RE z dbms a na b, zapisuję, że nie tylko to widziałem, ale zrobiłem to w kodzie produkcyjnym. Wcześniej korzystaliśmy z Oracle, musieliśmy zmienić dostawcę hostingu, rozliczonego na platformie Azure (zanim oni obsługiwali Oracle), więc musieliśmy przekonwertować na SQL Azure. Niestety w tym momencie nie rozdzieliliśmy całej logiki dostępu do danych, ale z pewnością zrobiliśmy to podczas migracji (i dalej, mogę dodać).
Joe
5
Wiem, że ten komentarz jest stary i zamknięty jako nie na temat, ale widziałem to w wielu firmach. Zazwyczaj jest to część procesu zbliżania się do ORM lub oddalania się od niej. Repozytorium ułatwia jego wyłączenie, szczególnie jeśli ładujesz je z abstrakcyjnego wzorca fabrycznego lub używasz kontenera IoC.
Derek Van Cuyk,
W rzeczywistości repozytorium używa DAO do operacji związanych ze źródłem danych ...
Yousha Aleayoub
1
@YoushaAleayoub to dobry punkt, który podnosisz. Zazwyczaj znajdziesz obiekty dostępu do danych, gdy ludzie próbują „oddzielić bazę danych”, i repozytoria, gdy ludzie próbują „uczynić jedną rzecz odpowiedzialną za zapytanie”. W prawie wszystkich przypadkach znajdziesz oba razem. Część jest DAO IConnection, ICommanditd część, która ukrywa typ bazy danych. Repozytorium jest zwykle bardziej skoncentrowane na domenach.
Fenton
181

To dobry przykład: przykładowy wzór repozytorium w C #

Zasadniczo repozytorium ukrywa szczegóły dotyczące tego, jak dokładnie dane są pobierane / utrwalane z / do bazy danych. Pod przykryciem:

  • do odczytu tworzy zapytanie spełniające podane kryteria i zwraca zestaw wyników
  • do pisania wydaje polecenia niezbędne do zapisania danych przez podstawowy aparat trwałości (np. baza danych SQL)
dwa kwiaty
źródło
13
Ten przykład jest najlepszym wyjaśnieniem w historii, po prostu lepszy niż dokumentacja MSDN.
Teoman shipahi
2
Uważam to za bardzo dobre. Zapewnia również przyzwoite wyjaśnienie dotyczące jednostki pracy, która wydaje się być bardziej ogólną formą wzorca danych nad
wzorcem
8
Połączony przykład jest awarią wzorca repozytorium. Nie daje żadnej przewagi w porównaniu do bezpośredniego korzystania z interfejsów dostarczonych przez Entity Framework ( IDbContext) lub w nhibernate ( ISession). Prawidłowo zaimplementowane repozytorium wyodrębnia WSZYSTKIE informacje dotyczące trwałości (takie jak sposób działania bieżącego dostawcy Linq To Sql). tzn. nigdy nie narażaj IQueryable.
jgauffin
3
@jgauffin IQueryablenie jest informacjami dotyczącymi trwałości. Tworzenie kopii zapasowej IQueryable może być tak proste, jak tablica z kodem na stałe, lub może pochodzić z pliku XML, usługi sieci Web, bazy danych, pliku płaskiego itp. Nie polecam repozytorium, które nie ujawnia IQueryable, jak zawsze. prowadzi do powolnego dostępu do danych w każdym przypadku, gdy ujawnienie IQueryable pozwoli niektórym instancjom na zwiększenie wydajności w stosownych przypadkach, jeśli magazyn trwałości ma taką możliwość. Ponadto ukrycie DbContext pozwala przełączyć się na inną ORM, jeśli zajdzie taka potrzeba (lub nie ORM!)
Robert McKee
5
Wycieka informacje dotyczące trwałości informacji. Spróbuj użyć chętnego / leniwego ładowania lub budowania INklauzuli sql, nie wiedząc, jak robi to konkretny dostawca LinqToSql.
jgauffin