Masz rację. DbContext
jest implementacją wzorca jednostki pracy i IDbSet
jest implementacją wzorca repozytorium.
Repozytoria są obecnie bardzo popularne i nadużywane. Wszyscy ich używają tylko dlatego, że istnieją dziesiątki artykułów o tworzeniu repozytorium dla frameworka jednostek, ale nikt tak naprawdę nie opisuje wyzwań związanych z tą decyzją.
Główne powody korzystania z repozytorium to zazwyczaj:
- Ukryj EF z górnej warstwy
- Spraw, by kod był lepiej testowalny
Pierwszym powodem jest pewna czystość architektoniczna i świetny pomysł, że jeśli uniezależnisz swoje wyższe warstwy od EF, możesz później przełączyć się na inną strukturę trwałości. Ile razy widziałeś coś takiego w prawdziwym świecie? Z tego powodu praca z EF jest znacznie trudniejsza, ponieważ repozytorium musi uwidaczniać wiele dodatkowych funkcji opakowujących to, na co domyślnie zezwala EF.
W tym samym czasie zawijanie kodu EF może zapewnić lepszą organizację kodu i przestrzegać reguły oddzielenia obaw. Dla mnie może to być jedyna prawdziwa zaleta repozytorium i jednostki pracy, ale musisz zrozumieć, że przestrzeganie tej reguły z EF może sprawić, że Twój kod będzie łatwiejszy w utrzymaniu i czytelniejszy, ale na początku wysiłek związany z utworzeniem aplikacji będzie znacznie wyższy i w przypadku mniejszych aplikacji może to być niepotrzebna złożoność.
Drugi powód jest częściowo poprawny. Dużą wadą EF jest sztywna architektura, z której trudno jest wyszydzać, więc jeśli chcesz przetestować jednostkową górną warstwę, musisz w jakiś sposób opakować EF, aby umożliwić mockowanie jego implementacji. Ale ma to wiele innych konsekwencji, które tutaj opisałem .
Śledzę bloga Ayende użytkownika . Jeśli kiedykolwiek używałeś NHibernate, prawdopodobnie znasz jego artykuły. Ten facet niedawno napisał kilka artykułów przeciwko używaniu repozytorium z NHibernate, ale NHibernate jest znacznie lepiej do podrobienia.