Mikuláš je tu! Získaj 90 % extra kreditov ZADARMO s promo kódom CERTIK90 pri nákupe od 1 199 kreditov. Len do nedele 7. 12. 2025! Zisti viac:
NOVINKA: Najžiadanejšie rekvalifikačné kurzy teraz s 50% zľavou + kurz AI ZADARMO. Nečakaj, táto ponuka dlho nevydrží! Zisti viac:

Diskusia – 1. diel - E-shop v ASP.NET MVC - Štruktúra riešenie

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Posledné komentáre sú na spodnej časti poslednej stránky.
Avatar
Odpovedá na Neaktivní uživatel
Marian Benčat:25.2.2016 23:42

Ano a ne... To samé platí i pro Unity of Work..

EF (ObjectContext) obsahuje DBSety, coz je defakto repository pattern,.. obsahuje operace jako find, "update", select atp... Tedy odstinuje od dat.. Jsou tam el poměrně vážné důvody, proč je opravdu dobré ještě nad touto abstrakcí postavit další abstrakci.. konkrétně některé z nich:

  1. Jedním z důvodu proč repository je, že chcete odstínit vyšší vrstvu od toho, jakým způsobem jsou data získávána, jak jsou uložena a chcete v tom místě uložit nějaké dotazy..

Toto se řeší dvouma způsobama - Repository a Query object.. Query object je místo, kde jsou ty dotazy a Repository má odstíňovat od "způsobu" jakým se s daty skutečně zachází..

To, že DBSet od toho neodstiňuje a EF také ne, povím v bodu dva..

U toho Query objectu by se vám často stávalo, že bduete mít hodně podobné dotazy - pro CRUD operace a bude se to lišit je v použitém DBSetu - DBSet<Kolo> DBSet<Volant> ale v obojim budete mít třeba dotazu Select TOP 1 .. nebo GetAllPaged (int pagesize, int page) atp.. Proč tedy tyto metody nenapsat genericky ?

Například pomocí GenericReposi­tory<Entita>? Todle je tedy jeden z důvodů proč repositář.. Můžete na něm mít další generické metody + složité dotazy...

Teď se nabízí otázka.. "a proč prostě nenapsat extension metodu na DBSet , tak jak to dělá třeba Query object?"

Odpověď je v bodě 2.

Odpovedať
Totalitní admini..
Avatar
Marian Benčat:25.2.2016 23:49
  1. Repository vás má odstiňovat od implementace, od způsobu získávání a manipulaci s daty.. z vnějšího pohledu by tedy mělo být "tajné" jak se to dělá..

proč toto EF nedělá? Proč je nutné mít nějaký ten repozitář?? Dám vám příklad...

Chci do controlleru / servisy (zde je to jedno) získat nějaké data na základě parametrů,.. třeba A, B, C,D.. Bez použití repository, by se tedy přímo pracovalo s EF:

A) //NecoController.cs
var data = dbcontext.Neco­.Where(..==A && ..==B ...);
Najednou treba dojdu k nazoru, ze EF je pomaly a tak to chci getovat pomocí procedury... nebo pomocí SQL příkazu.. nebo to chci ještě napojit na nějakou cache proxy..

Z definice repozitáře bych měl být schopný toto změnit aniž bych změnil "interface" - předpis... Jak to ale změním, aniž bych to musel přepsat všude? :) Odpověď je NIJAK, nejde to.

Nyní použiji repository:
B) //NecoController.cs
var data = myRepository.Get­Neco...(a,b,c,d);

//myrepository.cs
List<neco> GetNeco(a,b,c,d){
return dbcontext....
}

pokud použiji repozitář, můžu implementaci uvnitř změnit, aniž bych kvůli tomu musel překopávat jinou vrstvu.

Odpovedať
Totalitní admini..
Avatar
Marian Benčat:25.2.2016 23:50

Nejhorší, co však můžete udělat, je vracet z repozitáře IQueryable.. to je to největší nepochopení. (doufám že to autor v seriálu nedělá, bohužel článek nemám zaplacený).. Jinak Entity Framework je už sám o sobě Unity of Work (dbcontext a savechanges()). Proto je ve většině případů implementace UOW zbytečná a ve skutečnosti se jedná jen a pouze o stanovení resolvování (instancování) DBContextu z kontejneru.

Naopak většina UOW implementací, co je na internetu je špatná (jelikož ten UOW má na tvrdku stanovený DBContext, co má servírovat, což je narušení SOLIDu)

Editované
Odpovedať
Totalitní admini..
Avatar
Odpovedá na Marian Benčat
Neaktivní uživatel:26.2.2016 15:43

Popravdě, neorientuju se moc v těchto vzorech a tak jsem s EF pracoval vždy rovnou v controlleru. Nabyl jsem dojmu, že tyhle vzory ztěžujou manipulaci s dotazy a tak, ale nevím, jestli je to pravda. Nevíš kde bych mohl vidět korektní použití tohohle v EF, pokud se to teda používá...?

Odpovedať
Neaktivní uživatelský účet
Avatar
David Hartinger
Vlastník
Avatar
Odpovedá na Neaktivní uživatel
David Hartinger:26.2.2016 16:05

Nevíš kde bych mohl vidět korektní použití tohohle v EF, pokud se to teda používá...?

Samozřejmě, že se to používá, v kontroleru nemá datová logika co dělat, uvidíš to dále v seriálu pod kterým diskutuješ.

Odpovedať
New kid back on the block with a R.I.P
Avatar
Odpovedá na David Hartinger
Neaktivní uživatel:26.2.2016 16:08

Jak jsem ale řekl, názor lidí na to není tak jednoznačný. Plno lidí na SO nebo třeba Redditu tvrdí, že je to ve většině případů zbytečný.

EDIT: A jestli datovou logikou myslíš i normální select dotazy, tak to fakt nevím, proč by to měl být problém (kromě možnosti vyměnit pak EF za jiný ORM)

Editované
Odpovedať
Neaktivní uživatelský účet
Avatar
Odpovedá na Neaktivní uživatel
Marian Benčat:26.2.2016 20:44

Problém to skutečně je a nejde jen o to, když potřebuješ ef vyměnit třeba za proceduru, jak jsem už říkal, ale třeba i u testu, rozšiřování atp. Obecně to porušuje solid a pokud pohledas tak tam je i vysvětleno, proč rozdělení na vrstvy opravdu není špatné.

Odpovedať
Totalitní admini..
Avatar
Marian Benčat:26.2.2016 20:48

A jinak.. Jako příklad se klidně koukni do identity frameworku, tam máš normálně story - user store, role store atp. To je právě repozitar.. V implicitní sablone je implementovan jako entity framework, ale právě díky této abstrakcí to já můžu vzít a jen nahradit tento store ( repozitar za něco jiného) což je skvělé, protože to často potřebuješ.. Například pokud uživatelé nejsou uložené v databázi, ale třeba v souboru, jiném serveru, kdekoliv
.

Odpovedať
Totalitní admini..
Avatar
Ondřej Krsička:15.4.2016 13:58

Na kolik dílů bude tenhle seriál?

Avatar
JOF
Tvůrce
Avatar
Odpovedá na Ondřej Krsička
JOF:15.4.2016 14:03

Přesně to nevím, odhadem kolem třiceti ...

Posledné komentáre sú na spodnej časti poslednej stránky.
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zobrazené 10 správy z 29.