Czy repozytoria są już potrzebne w ASP.net 5 i EF7?

9

Wysłałem pytanie na github do zespołu EF. Dostałem odpowiedź, że lepiej zadać to pytanie tutaj, więc skopiuję i wkleję je tutaj jako link, aby inni mogli zobaczyć kilka odpowiedzi na GitHub.

Pytanie: Przeprowadziłem badania i ktoś zauważył, że wiersz 24 klasy DBContext stanowi

DbContext jest kombinacją wzorców jednostki pracy i repozytorium.

Czy to oznacza, że ​​nie musimy już wyodrębniać EF do repozytorium, a następnie używać i interfejsu do wstrzykiwania go do kontrolerów?

Oryginalny post na Github: https://github.com/aspnet/EntityFramework/issues/4899

Powód, dla którego o to pytam, wydaje mi się, że wchodzę w miejsce, w którym dodaję wiele metod do repozytorium, takich jak GetById, GetByName, GetWithIncludesABC, GetWithIncludes123 itd. I wydaje mi się, że w moim umyśle jest to brudne repozytorium

Loren.Dorez
źródło
1
Co sądzisz o odpowiedzi udzielonej przez Rowanmiller? Wydaje mi się całkowicie rozsądny.
Robert Harvey
@RobertHarvey Tak, to była dobra odpowiedź, ale chcę zobaczyć, co myślą inni na ten temat, zanim
podejmę
zobacz także lostechies.com/jimmybogard/2009/09/11/wither-the-repository, gdzie Bogard twierdzi podobnie.
mcknz
Moje zdanie na temat tego, dlaczego EF (i inne ORM) nie są repozytoriami .
Eric King
W repozytorium nie ma metody takiej jak GetWithIncludesABC. Wzorzec repozytorium jest abstrakcją, w zasadzie, tabeli bazy danych jako kolekcji. Zazwyczaj możliwe jest zapytanie do kolekcji (np. Przez LINQ), a repozytorium następnie przekształca zapytanie w SQL. To, o czym mówisz, bardziej przypomina bramę danych.
Pan Cochese,

Odpowiedzi:

12

Jeśli dodajesz metody do repozytorium, takie jak

GetById 
GetByName 
GetWithIncludesABC
GetWithIncludes123

Następnie lepiej przejść do warstwy usług i pozwolić, aby warstwa usługi bezpośrednio korzystała z EF. EF ma już funkcjonalność podobną do powyższych metod, które duplikujesz w nieskończoność.

Warstwa usług ujawnia metody domeny biznesowej i używa CRUD do ich wdrożenia. Na przykład możesz mieć metodę o nazwie TransferMoney(A, B), w której A i B sprawdzają konta. Dzięki temu możesz mówić w języku swojej domeny biznesowej, a warstwa usługowa obsługuje CRUD.

Jedynym istotnym powodem, dla którego mogę wymyślić oddzielną warstwę repozytorium, jest wymuszenie tej warstwy repozytorium lub zastąpienie innego źródła danych do celów testowych.

Robert Harvey
źródło
Jednak możesz wyśmiewać dbset ... msdn.microsoft.com/en-us/library/dn314429(v=vs.113).aspx
S1r-Lanzelot
4

Robert Harvey powiedział w swojej odpowiedzi:

Jedynym istotnym powodem, dla którego mogę wymyślić oddzielną warstwę repozytorium, jest wymuszenie tej warstwy repozytorium lub zastąpienie innego źródła danych do celów testowych.

Właśnie dlatego wzorzec repozytorium jest nadal aktualny. Nie zgadzam się również z twierdzeniem zespołów Entity Framework, że wdrażają wzorzec repozytorium. Entity Framework jest nadal bardzo związany z bazą danych. Głównym celem Wzorca Repozytorium jest odsprzęgnięcie i wyodrębnienie dokładnego mechanizmu trwałości stosowanego w aplikacji, aby nic z implementacji dostępu do danych nie wyciekło poza warstwę repozytorium.

Jeśli używasz interfejsu API zapytania EF poza „repozytorium”, jak w jakimś obiekcie usługowym, powiedziałbym, że łamiesz wzorzec.

Teraz, jeśli nie jest to katastrofalny problem dla wycieku bazy danych, takiej jak funkcjonalność bazy danych, i możesz zagwarantować, że nie będziesz musiał w przyszłości przenosić niektórych operacji CRUD do usługi internetowej, wówczas użycie EF byłoby bezpośrednie OK.

Zasadniczo Entity Framework zastępuje obiekt Gateway we wzorcu repozytorium. Nie uważam tego za samo repozytorium.

Greg Burghardt
źródło
Czym repozytorium różni się od aspektu warstwy usługi? z tego, co mogę znaleźć, jeśli zwracam IQueryable, to w zasadzie repozytorium, jeśli zwracam IEnumerable, to używam warstwy usługi. Czy to jest poprawne? Czy wzorce warstw usług i repozytoriów są podobne?
Loren.Dorez
@ Loren.Dorez: Warstwa usługi ma metody specyficzne dla domeny biznesowej, takie jak TransferFunds()i BuildWidget(). Repozytorium zawiera tylko metody CRUD.
Robert Harvey
Zatem zarówno warstwa usługowa, jak i repozytorium miałyby bezpośredni dostęp do DBContext? Czylibyście umieścili CRUD w repozytorium i uzyskali metody oraz inne metody w warstwie serwisowej? Czy rozumiem to poprawnie?
Loren.Dorez
Warstwa usług może uzyskać dostęp do repozytorium, jeśli go masz, zamiast EF bezpośrednio.
Robert Harvey
@RobertHarvey Czy możesz mi pokazać przykład, korzystając z powyższych metod Get Methds? Jak teraz jestem trochę zmieszany, przepraszam.
Loren.Dorez