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í

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.


 

  Aktivity (2)

Článek pro vás napsal JOF
Avatar

Jak se ti líbí článek?
Celkem (8 hlasů) :
55555


 



 

 

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

Avatar
Marian Benčat
Redaktor
Avatar
Marian Benčat:
  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. února 23:49
Avatar
Marian Benčat
Redaktor
Avatar
Marian Benčat:

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. února 23:51
 
Odpovědět 25. února 23:50
Avatar
Odpovídá na Marian Benčat
Jakub Šárník:

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. února 15:43
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Jakub Šárník
David Čápka:

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. února 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:

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. února 16:10
 
Odpovědět 26. února 16:08
Avatar
Marian Benčat
Redaktor
Avatar
Odpovídá na Jakub Šárník
Marian Benčat:

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. února 20:44
Avatar
Marian Benčat
Redaktor
Avatar
Marian Benčat:

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. února 20:48
Avatar
Ondřej Krsička
Redaktor
Avatar
Ondřej Krsička:

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

 
Odpovědět  +1 15. dubna 13:58
Avatar
JOF
Tým ITnetwork
Avatar
Odpovídá na Ondřej Krsička
JOF:

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

 
Odpovědět  +2 15. dubna 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 21. Zobrazit vše