EF 6 i Core + Repository & Unit of Work

0

Witam szanowne grono forumowiczy,

Mam pytanie jak to jest z tym EF, wzorcem Repositories i Unit of Work. Przeczytałem już kilka artykułów na ten temat i wydaje mi się, że warstwa repozytoriów jest zbędna. Nie chciałbym zagłębiać się w samą implementację tylko skupić na pytaniu czy korzystając z EF, nie ważne czy w wersji 6 czy Core, zasadne jest wprowadzanie repozytoriów i unit of work czy jest to sztuka dla sztuki i tworzenie kolejnej warstwy, która jest realizowana przez EF? Jeśli coś jest niejasne lub nie do końca sprecyzowane to chętnie wyjaśnię. Zapraszam do merytorycznej dyskusji.

EDIT
Dodatkowe pytanie jak to się ma w przypadku innych baz np. PostgreSQL lub MongoDB?

Pozdrawiam

3

sztuka dla sztuki i zabieranie sobie funkcjonalności które masz z 'pudełka'

1

Z własnego doświadczenia - zależy.
Pisałem już kilka projektów z ef I core I już przerabialem różne rzeczy . Wszystko zależy od podejścia.
Ogólnie wg mnie warstwa repozytorium przy użyciu ef to średnio z powodu tego, że repozytorium odpowiada za atomiczne operacje a dbcontext z ef to unit of work (odpowiada za całą transakcyjność)
Jeżeli używasz ddd to tam repozytorium jest wpisany w sam wzorzec. Niektórzy obchodzą to poprzez definiowanie providerów w domenie I przy użyciu domeny wiążą warstwę aplikacji z infrastrukturą uzywając Trackowania z providera przy wstrzykniętym kontekście.
Raz widziałem, repozytorium gdzie ma to sens, ale każda metoda repo tworzyła dbcontext, robiła savechanges i go niszczyła. Wpisywało się to fajnie
W repozytorium ale ograniczało ef poprzez uniemożliwienie działania unit of work. Odbijało się to czasem na performance.
Jeżeli nie potrzebujesz kodu solid, I jesteś pewny że nie zastąpisz ef czymś innym, to bym wstrzyknął kontekst lub utworzył to w warstwie aplikacji, szczególnie przy cr(r)s gdzie klasy są małe. Jeżeli chcesz działać full na interfejsach i mieć warstwę aplikacji niezależną od infrastruktury, to jakaś abstrakcja jest potrzebna i wtedy repozytoria najlepiej się sprawują zamiast interfejs na dbcontext (jest też możliwy dodatkowy interfejs unit of work odpowiedzialny za commit operacji). Repozytoria są dobre, gdy nie chcesz się przywiązywać do ef, np. Część byłaby w dapperze a część w ef.
Postrges jest obsługiwany przez ef core bardzo dobrze więc tu nie ma różnicy.

2
Krzysztof Pe napisał(a):

Mam pytanie jak to jest z tym EF, wzorcem Repositories i Unit of Work. Przeczytałem już kilka artykułów na ten temat i wydaje mi się, że warstwa repozytoriów jest zbędna. Nie chciałbym zagłębiać się w samą implementację tylko skupić na pytaniu czy korzystając z EF, nie ważne czy w wersji 6 czy Core, zasadne jest wprowadzanie repozytoriów i unit of work czy jest to sztuka dla sztuki i tworzenie kolejnej warstwy, która jest realizowana przez EF?

Owszem, jest to zbędne i szkoda tracić czasu. No chyba, że masz na tyle złożoną domenę, że repozytoria wnoszą do niej jakąś wartość.

Liar napisał(a):

Raz widziałem, repozytorium gdzie ma to sens, ale każda metoda repo tworzyła dbcontext, robiła savechanges i go niszczyła. Wpisywało się to fajnie
W repozytorium ale ograniczało ef poprzez uniemożliwienie działania unit of work. Odbijało się to czasem na performance.

Performance? Ten kod to zapewne był swoisty performance jakichś wybitnych artystów programistycznych, ale głównym problemem nie była wydajność.

Opisane przez Ciebie podejście to totalna aberracja, bo nie da się w ten sposób zaimplementować transakcji biznesowej. Jej wykonanie wymagałoby zaimplementowania dziwacznej orgii usuwania z bazy uprzednio wstawionych wartości, gdy któraś kolejna transakcja na poziomie repozytorium się nie uda.
Jedyny przypadek, w którym takie podejście by nie przeszkadzało, to CRUD z mapowaniem 1:1 na tabele. Ale w takiej sytuacji nie mamy repozytoriów tylko bieda-DAO.

Repozytoria są dobre, gdy nie chcesz się przywiązywać do ef, np. Część byłaby w dapperze a część w ef.

Do tego nie trzeba repozytoriów. Jeśli nagle zapragnie się zmienić ORM, to i tak trzeba będzie przerobić jakiś kod, jego pierwotne położenie nie ma większego znaczenia.

2

A po co.
Dopóki nie stosuje się DDD i podstawową rolą apki, to pobierz, wyświetl, zedytuj i zapisz, to tylko sobie dodajemy roboty.

Repozytoria często pokazują szamani w kursach, gdzie klepia interfejs żeby móc zamockowac klasę i mieć 90 procent pokrycia testami.
A inni tworzą jeszcze generyczne repozytorium CRUD i potem osobne repozytorium do kazdej klasy odzwierciedlajacej tabele w bazie.

W sumie nie wiem co gorsze.

1 użytkowników online, w tym zalogowanych: 0, gości: 1