NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze – Lekce 1 - E-shop v ASP.NET MVC - Struktura řešení

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
Odpovídá 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.

Odpovědět
25.2.2016 23:42
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.

Odpovědět
25.2.2016 23:49
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)

Editováno 25.2.2016 23:51
Odpovědět
25.2.2016 23:50
Totalitní admini..
Avatar
Odpovídá 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á...?

Odpovědět
26.2.2016 15:43
Neaktivní uživatelský účet
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá 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š.

Odpovědět
26.2.2016 16:05
New kid back on the block with a R.I.P
Avatar
Odpovídá 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)

Editováno 26.2.2016 16:10
Odpovědět
26.2.2016 16:08
Neaktivní uživatelský účet
Avatar
Odpovídá 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é.

Odpovědět
26.2.2016 20:44
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
.

Odpovědět
26.2.2016 20:48
Totalitní admini..
Avatar
Ondřej Krsička:15.4.2016 13:58

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

 
Odpovědět
15.4.2016 13:58
Avatar
JOF
Tvůrce
Avatar
Odpovídá na Ondřej Krsička
JOF:15.4.2016 14:03

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

 
Odpovědět
15.4.2016 14:03
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 29.