November Black Friday C# týden
BlackFriday je tu! Využij jedinečnou příležitost a získej až 80 % znalostí navíc zdarma! Více zde
Pouze tento týden sleva až 80 % na e-learning týkající se C#

Lekce 1 - E-shop v ASP.NET Core 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 Core 2.X 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 Core 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 Core - 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 - 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 ...

Kurz 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, zkušenosti s modernějším Core jsou vítanou výhodou. 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 menších displejích.

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 Core Web Application (já budu pracovat ve Visual studiu 2017 Community Edition - silně doporučuju používat alespoň verzi 15.7+). Tutoriál je psán pro verzi Core 2.1. Pokud tuto verzi nainstalovanou nemáte, můžete si aktuální SDK stáhnout zde. Zvolíme také Authentication Individual User Accounts.

Vytvoření projektu

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 je pojmenujte 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 projekt, zvolte Add -> Reference. V levé části okna vyberte Projects a zaškrtněte Data projekt. 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í.

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 č. 5. 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.

Struktura řešení

Obrázek 5 - 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 Core MVC - Identity, databáze a layout, se podíváme na konfiguraci ASP.NET Identity.


 

 

Článek pro vás napsal Martin Petrovaj
Avatar
Jak se ti líbí článek?
2 hlasů
Autor je lenivý vymýšľať nejaký slušný podpis. Venuje sa ale prevažne C#.
Všechny články v sekci
Kompletní e-shop v ASP.NET Core MVC
Miniatura
Následující článek
E-shop v ASP.NET Core MVC - Identity, databáze a layout
Aktivity (4)

 

 

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

Avatar
Martin Petrovaj
Překladatel
Avatar
Martin Petrovaj:21.12.2018 15:33

DAL (spomínaný dátový projekt) bude pracovať s ASP.NET Core Identity a s Entity Framework Core. Nekontroloval som to, ale tieto veci budú mať zrejme závislosti na .NET Core.

BL (business projekt) by na tom mohol byť lepšie, ale nedokážem ti zaručiť, že rôzne 3rd party knižnice používané v seriáli nebudú potrebovať .NET Core.

Celkovo je celý seriál o ASP.NET Core, tak by s tým trebalo tak trochu počítať :-) Väčšinou keď už sa aj robia mobilné appky k rôznym produktom, ktoré sú pôvodom na webe, tak sa to aj tak nerobí v .NETe / Xamarine, ale v nejakej používanejšej technológii (pre Android obvykle Kotlin / Java, pre produkty od Applu Swift). Mobilná aplikácia potom komunikuje s tou webovou cez jej API.

Odpovědět
21.12.2018 15:33
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
Odpovídá na Martin Petrovaj
Adam Gajdečka:21.12.2018 16:55

ok.

Ještě mám dotaz, není dobré používat Area v projektu?

 
Odpovědět
21.12.2018 16:55
Avatar
Martin Petrovaj
Překladatel
Avatar
Odpovídá na Adam Gajdečka
Martin Petrovaj:21.12.2018 16:58

Ak chceš, tak ich kľudne používaj. Osobne si ale myslím, že to má zmysel až od veľmi rozsiahlych projektov, tam to môže prísť vhod na prehľadnejšiu organizáciu pohľadov a pod.

Ak ich ale chceš použiť v tomto eshope, počítaj s tým, že ich budeš musieť sám zohľadniť v routovaní. Pri tom sa budeš musieť riadiť prevažne dokumentáciou od MS, keďže tento seriál areas nikde nevyužíva.

Odpovědět
21.12.2018 16:58
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
Odpovídá na Martin Petrovaj
Adam Gajdečka:23.12.2018 21:38

ok, díky. Už s tím mám zkušenosti a je to super.

Co mě hlavně zajímalo v tomto kurze je to, že vidím konečně, jak správně vytvořit strukturu projektu a oddělit projekt do jednotlivých vrstev.

 
Odpovědět
23.12.2018 21:38
Avatar
Adam Gajdečka:28.12.2018 16:39

Potřebuji posílat pěkné html emaily a metody k odeslání jsou v business vrstvě. Kam si uložit html šablonu a jednotlivé html emaily? V jaké vrstvě mají správně být. V datové?

Díky

 
Odpovědět
28.12.2018 16:39
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Martin Petrovaj
Překladatel
Avatar
Odpovídá na Adam Gajdečka
Martin Petrovaj:28.12.2018 17:14
  • Dátová vrstva (presnejšie v angl. Data Access Layer - vrstva pre prístup k dátam) ti obvykle získava dáta z databázy, API iných aplikácií, prípadne nejakých špeciálnych súborov tvojej aplikácie.
  • Business vrstva sa stará o spracovanie dát (či už z dátovej, alebo aplikačnej vrstvy) podľa logiky a pravidiel, ktoré tam naprogramuješ. Obsahuje objekty, ktorých úlohou je nad dátami vykonávať rôzne operácie, aby sa nimi neznečisťovali ostatné vrstvy. Business vrstva často sama využíva ešte ďalšie, menšie projekty a knižnice, ktoré riešia vždy jednu konkrétnu vec.
  • Aplikačná alebo prezentačná vrstva by sa ideálne mala zaoberať len zobrazovaním výstupu a dát používateľovi (s tým, že na základe jeho vstupu v nej často začína flow tvojej aplikácie, prevolávajú sa z nej metódy business vrstvy atď).

Pri plánovaní a vytváraní nových súčastí aplikácie a ich následnom rozdeľovaní by si sa mal (pri takejto 3-vrstvej architektúre) riadiť týmito základnými poučkami a zdravým rozumom.

HTML šablóny do emailov znie ako niečo, čo sa proste nakŕmi dátami a zobrazí používateľovi. Plus je to pravdepodobne (dizajnovo, graficky) naviazané na zvyšok tvojej prezentačnej vrstvy, akonáhle sa tam niečo významne zmení, bude potrebné meniť aj tie šablóny. Nie je to niečo, čo by malo zmysel alebo sa dalo portovať medzi rozdielnymi aplikáciami a riešeniami (pekný týždenný email z dámskeho eshopu a z banky asi budú vyzerať, mierne povedané, inak). Osobne by som to dal do tejto vrstvy v momente, keď som prečítal skratku HTML.

Metódy na odosielanie mailov sú v business vrstve, pretože riešia presne a len to - odosielanie mailov. Nestarajú sa o to, čo sú to za maily, odkiaľ prišli a kam idú. Proste príde nejaký string (či už ako plain text, HTML, byte string, whatever) a ten objekt ho pošle na jeho šťastnú cestu internetom. Nemal by si mať žiaden problém s použitím toho istého objektu bez úprav v rôznych projektoch, ktoré emaily posielať potrebujú.

No a potom tu ostáva posledná otázka, a síce čo ti odosielanie tých emailov riadi. Odošlú sa po nejakej akcii používateľa (napr. po registrácii alebo zakúpení tovaru)? Tak nech si to ošéfuje daný controller - povie business vrstve, tu máte takýto pekný email, pošlite ho na adresu užívateľa x. Done. Má sa posielať vždy v určitý čas? Má sa poslať po nejakom inpute alebo zmene u tretej strany? V takýchto prípadoch už sa treba zamyslieť viac.

Odpovědět
28.12.2018 17:14
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
Odpovídá na Martin Petrovaj
Adam Gajdečka:28.12.2018 17:34

díky za parádní vysvětlení.

Poslat email bude potřeba třeba i při změně ceny (typicky hlídací pes). Proto pokud to budu mít v prezentační vrstvě, tak se k tomu nedostanu. Jinak to budou vesměs nová objednávka apod.

Jde tedy jen o naplnění šablony daty a odeslání.

Chtěl bych to realizovat nějak takto https://www.c-sharpcorner.com/…pplications/

Jen nemám jasno, kam tedy uložit ty šablony.

 
Odpovědět
28.12.2018 17:34
Avatar
Martin Petrovaj
Překladatel
Avatar
Odpovídá na Adam Gajdečka
Martin Petrovaj:28.12.2018 17:44

Pokiaľ sa budú ceny meniť z nejakého administrátorského rozhrania (admin sa prihlási a v systéme nastaví produktu novú cenu, zľavu a pod.), tak to môžeš spraviť z prezentačnej vrstvy v POSTovej akcii (najprv cez business vrstvu upravíš ceny, potom v tej istej akcii opäť cez b.v. pošleš požadovaný email).

V takom prípade či už súbor so šablónou načítaš v prezentačnej vrstve, alebo si na to spravíš jednoduchý loader v business vrstve, to je už na tebe. Pre čistotu kódu by som odporúčal druhý spôsob, ale nemôžem sa veľmi ozývať, keďže (pôvodný ASP.NET a tým pádom aj) tento tutoriál to práve znásilňuje tým prvým spôsobom :-D

Pokiaľ tie ceny meníš nejako inak, nedajbože na férovku updatom databázy, tak to budeš mať trochu horšie. Budeš si musieť v aplikácii pripraviť nejaký mechanizmus kontroly, či sa niečo v databáze zmenilo a ak áno, poslať ten mail. O získanie "čerstvých" dát by sa ti pri striktnom dodržiavaní rozdelenia zodpovednosti mala starať dátová vrstva, business vrstva by potom mala rozhodnúť, či nastala zmena a na základe toho rozhodnúť o ďalšom postupe. Máš asi pravdu v tom, že v tom prípade by si na niektorom mieste musel načítavať príslušné šablóny priamo z business vrstvy.

Editováno 28.12.2018 17:45
Odpovědět
28.12.2018 17:44
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
Odpovídá na Martin Petrovaj
Adam Gajdečka:28.12.2018 21:12

Hledal jsem a hledal. Došel jsem k tomu, že nechci HTML, ale Razor Pages. Abych mohl skládat emaily.

Všechny ty .cshtml umístím do Razor Class Library. Vycházím z https://github.com/…orHtmlEmails
https://scottsauber.com/…ass-library/

 
Odpovědět
28.12.2018 21:12
Avatar
Daemmon
Člen
Avatar
Daemmon:4. dubna 16:02

Ahojte, mam jeden takovy dotaz. Když udelam dle postupu na vytvoreni Eshopu krok, ze pridam další projekt napise mi to tuhle chybu.
The current .NET SDK does not support targeting .NET Core 2.2. Either target .NET Core 2.1 or lower, or use a version of the .NET SDK that supports .NET Core 2.2.
To jsem odstranil tak, ze jsem klikl na ten pridany projekt pravym > properties a nastavil target framework na 2.0
(stejne jako byl nastaven projekt od zacatku). Nevim podle ceho se to nastavi defaultne a rucne to při zakladani nikde nejde nastavit. A ve vlastnostech v prislusnem radku nic není. Chyba sice zmizela ale při pokusu o nastaveni reference z aplikačního projektu na ten pridany mi to napsalo tuhle chybu.
csproj' targets 'netcoreapp2.2'. It cannot be referenced by a project that targets '.NETCoreApp,Ver­sion=v2.0'.
Po restartu VS chyby zmizely ale nerozumim tomu. Chapu sice, ze je to nejaky problem mezi frameworky ale cely projekt jsem od zacatku (dle tutoru) nastavilů na NET Core 2.0. Proc mi to tedy pise chyby a odkazuje se to na NET Core 2.2 ? Diky.

 
Odpovědět
4. dubna 16:02
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 14. Zobrazit vše