Niedawno przeczytałem wiele argumentów przeciwko używaniu wzorca repozytorium z potężnymi mechanizmami ORM, takimi jak Entity Framework, ponieważ zawiera on funkcje podobne do repozytorium, a także funkcjonalność jednostki pracy.
Kolejnym argumentem przeciwko używaniu wzorca do sytuacji takiej jak testowanie jednostkowe jest to, że wzorzec repozytorium jest nieszczelną abstrakcją, ponieważ bardziej ogólne implementacje wykorzystują IQueryable.
Argumenty przeciwko użyciu wzorca repozytorium mają dla mnie sens, ale sugerowane alternatywne metody abstrakcji są często bardziej mylące i wydają się równie przesadne jak problem.
Rozwiązanie Jimmy'ego Bogardsa wydaje się być mieszanką zdmuchiwania abstrakcji, ale także wprowadzania własnej architektury. https://lostechies.com/jimmybogard/2012/10/08/favor-query-objects-over-repositories/
Kolejny przykład niepotrzebnych repozytoriów .... ale używaj mojej architektury! http://blog.gauffin.org/2012/10/22/griffin-decoupled-the-queries/
Kolejny ... http://www.thereformedprogrammer.net/is-the-repository-pattern-useful-with-entity-framework
Nie znalazłem wyraźnego zamiennika lub alternatywy dla „zbyt złożonego” podejścia do wzorców repozytoriów, które samo w sobie nie jest bardziej architektoniczne.
źródło
Odpowiedzi:
Myślę, że łączysz repozytoria i repozytoria ogólne.
Podstawowe repozytorium po prostu łączy Twój magazyn danych i zapewnia metody zwracania danych
Nie przecieka warstwy danych do twojego kodu poprzez IQueryable lub inne sposoby przekazywania losowych zapytań i zapewnia dobrze zdefiniowaną testowalną i wstrzykiwalną powierzchnię metod.
Ogólne repozytorium pozwala przekazać zapytanie podobnie jak ORM
Zgadzam się, że nie ma sensu używać Ogólnego repozytorium na ORM, które jest po prostu kolejnym Ogólnym repozytorium.
Odpowiedzią jest użycie podstawowego wzorca repozytorium do ukrycia ORM
źródło
Większość argumentów, o których wspominasz, błędnie przypisuje funkcje wzorca repozytorium, których nie ma.
Pod względem koncepcyjnym repozytorium, jak pierwotnie zdefiniowano w DDD, to tylko zbiór obiektów, które można wyszukiwać lub dodawać do nich. Mechanizm utrzymywania się za nim jest wyodrębniony, więc jako konsument masz złudzenie, że jest to kolekcja w pamięci.
Implementacja repozytorium z nieszczelnymi abstrakcjami (
IQueryables
na przykład ujawnianie ) jest słabą implementacją repozytorium.Implementacja repozytorium, która ujawnia więcej niż tylko operacje gromadzenia (na przykład funkcje jednostki pracy), jest słabą implementacją repozytorium.
Czy istnieją alternatywy dla repozytorium dostępu do danych? Tak, ale nie są one związane z problemami, które poruszasz w swoim pytaniu.
źródło
Dla mnie repozytoria w połączeniu z ORM lub innymi warstwami trwałości DB mają następujące wady:
Jak na przykład:
4. Obiekt Danger of God: możesz pokusić się o utworzenie jednej klasy boga, obejmującej cały model lub warstwę dostępu do danych. Klasa repozytorium zawierałaby nie tylko metody Car, ale także metody dla wszystkich encji.
Moim zdaniem lepiej jest oferować przynajmniej kilka możliwości zapytania, aby uniknąć ogromnego bałaganu wielu metod jednocelowych. Bez względu na to, czy jest to LINQ, własny język zapytań, czy nawet coś wzięte bezpośrednio z ORM (OK, rodzaj problemu sprzęgania ...).
źródło
Jeśli celem interfejsu repozytorium jest wyśmiewanie bazy danych w celu przeprowadzenia najbardziej jednoznacznego (= testowania w izolacji), najlepszą abstrakcją jest coś, co łatwo wyśmiewać.
Trudno jest wyśmiewać interfejs repozytorium oparty na wyniku IQueryable.
Z punktu widzenia testów jednostkowych
można łatwo wyśmiewać
można łatwo wyśmiewać tylko wtedy, gdy próbka ignoruje treść parametru zapytania.
nie można go łatwo wyśmiewać
źródło
Nie sądzę, że wzorzec repozytorium jest przesadzony, jeśli używasz funkcji lambda do tworzenia zapytań. Zwłaszcza gdy musisz wyodrębnić ORM (moim zdaniem zawsze powinieneś), nie będę obchodził szczegółów implementacyjnych samego repozytorium.
Na przykład:
źródło