Repozytoria w żadnym wypadku nie są logiką biznesową aplikacji. Powinny się ograniczać wyłącznie do operacji CRUD.
Repozytoria to kontrakty źródeł danych dla logiki biznesowej, z jej punktu widzenia mają się zachowywać po prostu jak kolekcja encji. To, że konkretne implementacje repozytoriów wykonują operacje CRUD na bazie nie zmienia faktu, że ich kontrakty muszą być częścią logiki biznesowej, żeby mogła ona na nich operować. W tym sensie repozytoria są częścią logiki biznesowej - co nie znaczy, że ją wykonują.
Nie potrafie sobie wyobrazić jak View Modele miałyby odciążyć bazę danych:D, wręcz odwrotnie, obciążają serwer.
To uwaga do wszystkich - same ViewModele nie odciążają ani nie obciążają bazy danych... No chyba, że trzymamy w niej kod C#. ;)
Odciążyć może generowanie ViewModeli na poziomie warstwy dostępu do danych, która zbuduje optymalne zapytania. Tylko to wymaga odejścia od podejścia z repozytoriami zwracającymi encje na rzecz prostoty i wydajności.
Porównywanie NHibernate z ET to jakaś głupota, oba frameworki służą do tego samego i różnią się detalami.
NHibernate oferuje wbudowane cache drugiego poziomu, kilka generatorów PK, obsługuje różne rodzaje kolekcji, możliwość batchowego wykonywania zapytań, pełną konfigurowalność (w dowolnym miejscu można się wpiąć i zmienic domyślne zachowanie lub wykonać dodatkową operację), możliwość wykonywania operacij bez wczytywania obiektów (w EF, żeby usunąć obiekt z bazy, musisz go najpierw odczytać!) i daje pełną kontrolę nad generowanym kodem SQL.
EF ma za to tylko LINQ providera generującego kod SQL metodą Monte Carlo. No i od grudnia zeszłego roku obsługuje takie skomplikowane elementy składni SQL 2012 jak OFFSET FETCH. Do tego implementuje własną matematykę, bo domyślnie przy zapisie liczby zmiennoprzecinkowej nie wykonuje zaokrąglenia tylko ucięcie miejsc po przecinku.
To są detale?
Do tego praca z takim RavenDb to czysta przyjemność. Można nawet pokusić się o zrezygnowanie z repo bo RavenDb jest implementowany w postaci właśnie UOW.
No, a w ORM to nie można? Dziwne, bo ja (o ile mam wpływ na projekt) repozytoriów nigdy nie używam. Repozytoria w 99% aplikacji nie są potrzebne, bo 99% aplikacji nie potrzebuje DDD. A ISession
czy nawet głupi DbContext
są same w sobie implementacjami UoW.