Body zdarma Java týden
Využij podzimních slev a získej od nás až 40 % bodů zdarma! Více zde
Pouze tento týden sleva až 80 % na Java e-learning!

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

Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem.
Vydávání, hosting a aktualizace umožňují jeho sponzoři.

Vítám všechny středně pokročilé a pokročilé programátory u kurzu E-shop v ASP.NET MVC. Je určen pro všechny, kteří mají za sebou základy této technologie alespoň v rozsahu zdejších Základů ASP.NET MVC a chtějí se posunout na další úroveň. V tomto on-line kurzu vytvoříme plně funkční e-shop s využitím následujících technologií:

  • Entity Framework - ORM s metodikou Code First
  • Repository - návrhový vzor pro práci s daty
  • ASP.NET Identity - framework pro správu uživatelů a rolí, autentizaci a autorizaci
  • Extension metody - nebude jich mnoho, ale ukážeme si příklady jak rozšířit funkcionalitu stávajících tříd
  • Generické třídy - umí ušetřit spoustu psaní a věřím, že si je oblíbíte
  • AutoMapper - pomáhá s mapováním tříd
  • Javascript - trocha kódu bude i na straně klienta ...
  • AJAX a mnoho dalších ...

Seriál vás dokonale připraví na zaměstnání v C# .NET, jelikož většina pracovních pozic vyžaduje kromě samotného C# dobrou znalost webového frameworku ASP.NET MVC. Samozřejmě můžete znalosti využít i do svého podnikání.

Základní požadavky na e-shop

Jelikož obchod bude opravdu reálně použitelný, zamysleme se alespoň nad základními požadavky:

  • Správa uživatelů a rolí - tak jako ve většině webových aplikací i zde je potřeba rozlišovat běžné návštěvníky e-shopu od administrátorů, kteří mají dostupných více funkcionalit. Navíc ještě musíme umožnit nákup i neregistrovaným uživatelům (uživatelům bez přihlašovacích údajů).
  • Správa produktů a kategorií - přehledně zobrazit produkty (včetně jejich obrázků) s možností vkládání a editace. Zařazovat produkty do kategorií. Vyhledávat, filtrovat a řadit produkty ve výpisu. Umožnit uživatelům napsat hodnocení zakoupeného produktu.
  • Systém objednávek - vést uživatele nákupním procesem od vložení zboží do nákupního košíku přes zadání fakturačních údajů a výběr způsobu dopravy až po dokončení objednávky včetně odeslání potvrzovacího emailu.
  • Historizace záznamů - zajistit integritu a platnost dat. Žádné provedené úpravy nesmějí ovlivnit již provedené transakce v e-shopu.
  • Responzivní web design - přehledně zobrazovat stránky i na displejích s menším rozlišením.

Požadovaný vzhled aplikace

Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Požadovaný vzhled si přiblížíme na následujících obrázcích:

Přehled produktů z vybrané kategorie Přehled produktů z vybrané kategorie

Registrační formulář Registrační formulář

Přehled produktů v košíku – první krok při dokončení objednávky Přehled produktů v košíku - první krok při dokončení objednávky

Začínáme...

Ve Visual Studiu si vytvořte si nový projekt typu ASP.NET Web Application (já budu pracovat ve Visual studiu 2015 Community Edition). Vzhledem k tomu, že ASP.NET 5 je teprve ve verzi RC1, použijeme template MVC z ASP.NET 4.5.2 Templates (viz obrázek 4) a ponecháme Authentication Individual User Accounts. Až bude verze 5 nějak rozumně rozšířená, přidám do seriálu pár novinek které umožňuje a dopíši o tom článeček.

Obrázek 4

Obrázek 4 - Vytvoření projektu

Struktura řešení

Reálné komerční projekty mají spoustu tříd a určitě bychom si v nich nevystačili pouze s rozdělením struktury projektu na modely, kontrolery a pohledy. Mít v jedné složce desítky souborů je minimálně nepřehledné. Kód by se špatně spravoval a z vlastní zkušenosti mohu říci, že byste se dostali do bodu, kdy byste psali podobné metody znovu a znovu místo toho, abyste parametrizovali nějakou existující, protože byste zkrátka ani nevěděli, že v projektu nějaká podobná již je. A to je začátek konce :). Jak z toho ven?

Projekty

Celé řešení rozdělíme do více vrstev. Každá vrstva bude v samostatném projektu. Náš projekt bude středně složitý, proto si vystačíme s následujícími vrstvami:

  • Datová vrstva - bude obsahovat část, která se bude starat o ukládání a načítání dat. Ostatní části řešení budou využívat její metody (a v našem případě asi i třídy) aniž by se zajímaly o to, kde jsou vlastně data uložena a jakým způsobem. Metody pro práci s daty implementujeme do této vrstvy v podobě repositářů.
  • Business vrstva - bude obsahovat téměř všechnu logiku našeho řešení rozdělenou do tzv. manažerů podle entit, ke kterým dané metody patří. Dále sem přidáme nějaké pomocné třídy, ViewModely a nějaký "mapper", který nám pomůže přetypovávat třídy mezi sebou.
  • Aplikační vrstva - to je ten náš (zatím jediný) vytvořený projekt. Bude obsahovat hlavně kontrolery a pohledy (většina modelů bude v business vrstvě) a samozřejmě také další části, které patří k webové aplikaci - css styly, skripty, obrázky apod.

Přidejte si tedy do nového řešení 2 projekty (například v místní nabídce Solution -> Add -> New Project -> Class Library). Co se pojmenování týče, doporučuji všude používat výhradně angličtinu, takže například EShop.Business a EShop.Data. Čeština je v programování pouze pro začátečníky a v reálných aplikacích by se objevovat neměla. Minimálně to zvýší čitelnost vašeho kódu pro další programátory.

Nastavení referencí

Abychom mohli v jednom projektu využívat objektů z jiného projektu, musíme si nastavit reference. Nejjednodušším způsobem je asi využít místní nabídku. V Solution Exploreru klikněte v Business projektu pravým tlačítkem myši na References, z místní nabídky vyberte Add Reference..., v levé části okna vyberte Projects a zaškrtněte Data projekt (viz obrázek č. 5). Obdobným způsobem nastavte referenci z Aplikačního projektu na Business projekt. Protože naše aplikace bude ještě v udržitelném rozsahu, nebudeme v business vrstvě využívat žádné DTO nebo DAO modely a nastavíme si referenci i z Aplikačního projektu na Data projekt. U ještě větších aplikací bývá Aplikační vrstva od datové úplně odstíněna, nám bude bohatě stačit když si vyzkoušíme jen toto logické rozdělení.

Nastavení reference

Obrázek 5 - Nastavení reference

Složky

V jednotlivých projektech si budeme uspořádávat soubory s kódem do složek (a třídy do odpovídajících jmenných prostorů). Výslednou strukturu hotového projektu můžete vidět na obrázku č. 6. Význam složek se dá většinou odvodit z jejich názvu. Složky si nyní vytvářet nemusíte, budeme je vytvářet postupně podle potřeby.

Obrázek 5

Obrázek 6 - Navrhovaná struktura řešení

To by bylo pro dnešek vše. Máme představu o tom, jak bude vypadat struktura našeho řešení a proč. V příští lekci, E-shop v ASP.NET MVC - Konfigurace ASP.NET Identity, se podíváme na konfiguraci ASP.NET Identity.


 

 

Aktivity (3)

 

 

Komentáře

Avatar
vajkuba1234
Člen
Avatar
vajkuba1234:19.2.2016 11:01

Konečně! :) Už se nemohu dočkat dalšího dílu! :)

Odpovědět  +1 19.2.2016 11:01
No hope, no future, JUST WAR! For world peace Israel must be DESTROYED!
Avatar
Michal Oravec:19.2.2016 13:36

Ako casto budu tie clanky vychadzat?

 
Odpovědět 19.2.2016 13:36
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Michal Oravec
David Čápka:19.2.2016 13:55

Chtěli bychom vydávat 2 týdně, uvidíme jak se zadaří. Ono to není PHPčko, umí to mnohem méně lidí, informace se hůře shánějí. V současné době existuje relativně odladěný projekt, ke kterému se sepisují tyto články, začátek šel docela špatně, jelikož se tam blbne s tím Identity, další články by měly jít rychleji.

Odpovědět  +3 19.2.2016 13:55
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Odpovídá na David Čápka
Štefan Pružinský:19.2.2016 14:13

Great! :) Konečne je to tu. Presne na to som čakal - je to unikát, presne ako vravíš, je o tom oveľa menej informácii ako napríklad o PHP. Človek sa často niekde zasekne a nevie kam ďalej. S touto situáciou sa stretávam už dlhšiu dobu pri UWP aplikáciach...SO poradí len veľmi skúpo, niekedy aj vôbec... Prajem veľa zdaru v ďalšej práci. :)

Odpovědět  +2 19.2.2016 14:13
Najefektívnejším spôsobom debuggingu je modlitba. :)
Avatar
Odpovídá na David Čápka
Andrej Farkaš:19.2.2016 14:19

Robil som v tom diplomovku a Identity sa celkom ťažko zapracováva do nejakej rozumnej architektúry ako je tu, takže som zvedavý a teším sa, keď budem pozerať ako sa to podarilo vyriešiť vám.

Odpovědět 19.2.2016 14:19
Live. Love. Learn.
Avatar
David Horák
Člen
Avatar
David Horák:19.2.2016 14:59

Skvělá zpráva, už se těším na pokračování ;-)

 
Odpovědět  +1 19.2.2016 14:59
Avatar
Milan Gallas
Redaktor
Avatar
Milan Gallas:21.2.2016 19:28

Teď už jenom e-shop v JEE :D

 
Odpovědět  +1 21.2.2016 19:28
Avatar
Jindřich Máca
Tým ITnetwork
Avatar
Odpovídá na Milan Gallas
Jindřich Máca:21.2.2016 19:47

Na to taky dojde. :-D

 
Odpovědět  +2 21.2.2016 19:47
Avatar
Marian Benčat
Redaktor
Avatar
Odpovídá na Andrej Farkaš
Marian Benčat:25.2.2016 22:25

Proč myslíte? Naopak.. Identity framework je krásně rozdělený na vrstvy a je naprosto geniálně implementován.. Jsou tam:
Dtočka - implementující IUser, IRole atp
Repozitáře - implementujici iUserStore IUserRoleStore atp
Manažery - USerManager, RoleManager, SignInManager..

rozdělení je tedy velmi jednoduché, stačí implementovat 4 rozhrani a máte defako správu uživatelů (role + uživatele) hotovou.. není problém to napojit na IOC atp.

Pokud chcete přidat funkcionalitu, implementujete další rozhraní ve storu,.. manager to pak je schopny detekovat a na zaklade toho upravit template metody.

Odpovědět 25.2.2016 22:25
Totalitní admini..
Avatar
Jakub Šárník:25.2.2016 23:36

V ASP.NET a EF moc nedělám, ale něco jsem si o tom už hledal a zdá se mě, že Repository pattern je už v za kladním EF ne? I komunita to tvrdí a že prej není potřeba...

 
Odpovědět 25.2.2016 23:36
Avatar
Marian Benčat
Redaktor
Avatar
Odpovídá na Jakub Šárník
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  +1 25.2.2016 23:42
Totalitní admini..
Avatar
Marian Benčat
Redaktor
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  +1 25.2.2016 23:49
Totalitní admini..
Avatar
Marian Benčat
Redaktor
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
Jakub Šárník: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
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Jakub Šárník
David Čápka: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  +1 26.2.2016 16:05
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Odpovídá na David Čápka
Jakub Šárník: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
Avatar
Marian Benčat
Redaktor
Avatar
Odpovídá na Jakub Šárník
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
Redaktor
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
Redaktor
Avatar
Ondřej Krsička:15.4.2016 13:58

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

 
Odpovědět  +1 15.4.2016 13:58
Avatar
JOF
Tým ITnetwork
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  +2 15.4.2016 14:03
Avatar
Ondřej Krsička
Redaktor
Avatar
 
Odpovědět 15.4.2016 14:29
Avatar
JosefSenkerikxw:24.4.2017 17:35

Ahoj, chci se zeptat, jak to s placením tohoto seriálu, platí se každý jednotlivý článek nebo plošně za celý seriál? Děkuji

 
Odpovědět 24.4.2017 17:35
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na JosefSenkerikxw
vajkuba1234:25.4.2017 2:17

Plati se za jednotlive dily...

Odpovědět 25.4.2017 2:17
No hope, no future, JUST WAR! For world peace Israel must be DESTROYED!
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na JosefSenkerikxw
David Čápka:3.5.2017 15:51

Platí se jednou a následně si odemykáš články za body, které sis koupil. Je to tam napsané :)

Odpovědět 3.5.2017 15:51
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Neaktivní uživatel:19.5.2017 11:49

Hoj, je v planu aktualizace pod ASP.NET Core? :)

Odpovědět 19.5.2017 11:49
Neaktivní uživatelský účet
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Neaktivní uživatel
David Čápka:20.5.2017 21:52

Samozřejmě, všechny kurzy na síti průběžně aktualizujeme. Nemyslím si však, že je to v dohledné době nutné, zatím je to stále nejaktuálnější a nejkompletnější kurz ASP.NET MVC na českém internetu a odpovídá tomu, co je ve firmách nejrozšířenější.

Odpovědět 20.5.2017 21:52
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Odpovídá na David Čápka
Neaktivní uživatel:20.5.2017 23:37

Jasne, jasne :) Ja prave nevim, jestli mam zacinat s ASP.NET MVC nebo Core, protoze nez se naucim poradne MVC tak uz bude Core 3/4/... :D

A nevim jestli core je stejne jak MVC, protoze jsem cetl, ze je to vlastne MVC6(teoreticky by melo byt, ale jisty si nejsem...)

Odpovědět 20.5.2017 23:37
Neaktivní uživatelský účet
Avatar
Patrik Valkovič
Šéfredaktor
Avatar
Odpovídá na Neaktivní uživatel
Patrik Valkovič:20.5.2017 23:40

Od ASP.NET MVC5 by měl jít ten stejný kód na core i klasickém .NETu, takže je asi jedno, co budeš používat.

Odpovědět  +1 20.5.2017 23:40
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Filip Válek
Člen
Avatar
Filip Válek:18. června 11:32

Ahoj,

poradil by někdo jak tuto aplikaci nasadit na server?

 
Odpovědět 18. června 11:32
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 29 zpráv z 29.