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

C# .NET ASP.NET E-shop E-shop v ASP.NET MVC - Struktura řešení

ONEbit hosting 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 seriálu 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 seriálu 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

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 následujícím článku se podíváme na konfiguraci ASP.NET Identity.


 

 

Článek pro vás napsal JOF
Avatar
Jak se ti líbí článek?
10 hlasů
Aktivity (2)

 

 

Komentáře
Zobrazit starší komentáře (13)

Avatar
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
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
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
"C# 3.0 (2007) volal Java 8 (2014), že chce svoje featury zpět"
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
"C# 3.0 (2007) volal Java 8 (2014), že chce svoje featury zpět"
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:Včera 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 Včera 17:35
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na JosefSenkerikxw
vajkuba1234:2:17

Plati se za jednotlive dily...

Odpovědět 2:17
No hope, no future, JUST WAR! For world peace Israel must be DESTROYED!
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 23. Zobrazit vše