PV179 #3 Patrik Behrami, Lukáš Daubner Obsah uRepository pattern uMotivace uPříklad uPraktická ukázka uUnit of work pattern uMotivace uPříklad uPraktická ukázka uSamostatná práce 1 & 2 uZávěr a diskuze u Repository pattern - motivace uPoskytuje vrstvu abstrakce mezi konzumentem dat a „tvrdou“ implementací přístupu k datům (=v našem případě EF) uRepository jsou v našem případě třídy, které zapouzdřují funkčnost a logiku přístupu k datům uTypická implementace koresponduje s vytvořenými DAL modely (=1 repository rozhraní a implementace pro každý model nebo…to si řekneme na konci J) u!Jako obvykle, tento přístup není tzv. silver bullet! uPo ukázce „správného“ řešení na konci cvičení si řekneme nevýhody Repository pattern - příklad u Repository – praktická ukázka u Unit of Work – motivace uJe používán pro sjednocení logického celku několika operací prováděných nad datovým úložištěm tak, aby vždy všechny prošly nebo všechny selhaly (=simulace databázové transakce) uV našem podání objekt, který udržuje veškeré změny na datech v průběhu jedné „transakce“ a následně zajišťuje, že se změny persistují nebo zahodí uČasto kombinován s Repository patternem uV našem případě (při využití EF), implementace UoW například poskytuje našim repozitářům sdílet instanci DBContextu – i díky tomu dokáže zajistit atomičnost operací a korektní dispose spojení k databázi po ukončení „transakce“ Unit of Work - příklad u Unit of Work - praktická ukázka u Samostatná práce – úvod uLab03_Tasks uZoo.DAL - Vytvořený DAL s modely, migracemi, data seedem uZoo.App – Konzolová aplikace konzumující Zoo.DAL, která orchestruje čtení a zapisování dat Samostatná práce – zadání první části 1.Zajistěte, aby v konzolové aplikaci neexistovala závislost implementace na DbContextu uRepository pattern 2.Zajistěte, že všechny změny dat provedené během jedné operace se buďto provedou, nebo selžou uUnit Of Work pattern u uČas: ~25 min 1. Samostatná práce – ukázka řešení první části u u Samostatná práce – zadání druhé části uPokud jste nestihli udělat plné řešení, použijte Lab03_Better 1.Zredukujte existující kód tak, aby zbytečně nebyl duplikován pro stejné operace nad různými objekty uNápověda 1: Využijeme generik 2. 1. Samostatná práce – zadání druhé části 1.Zredukujte existující kód tak, aby zbytečně nebyl duplikován pro stejné operace nad různými objekty uNápověda 1: Využijeme generik uNápověda 2: Generic repository pattern uNápověda 3: Použití DbSet lze kombinovat s generiky u uČas: ~20 min 1. 1. Samostatná práce – ukázka řešení druhé části u Repository a Unit of Work – závěr a diskuze uNad všemi design patterny je potřeba přemýšlet jako nad jednou z možných cest, nikoliv zázračnou magickou formulí, která vyřeší všechny problémy uNaše repozitáře v tomto Labu jsou velmi zjednodušené – nepovolují např. přenesení filtrování a pagingu až na DB úroveň uTzn. je nutné vždy vytáhnout všechna data do paměti, což je samozřejmě v běžné aplikaci nemyslitelné uO užitečnosti Repository a speciálně Generic repository patternu v kombinaci s moderními ORM se vedou diskuze (odkaz 1, odkaz 2, odkaz 3) uMožnost alternativy či doplňku k repozitářům – query objects