Využij akce až 30% zdarma při nákupu e-learningu. Zároveň pouze tento týden sleva až 80 % na e-learning týkající se Javy
Hledáme fulltime koordinátora/ku kurzů. 100% homeoffice,100% časově flexibilní. Mám zájem!
discount week 30

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

Vítám všechny středně pokročilé a pokročilé programátory u kurzu E-shop v ASP.NET Core 3.X MVC. 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# také 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í webdesign - Přehledně zobrazovat stránky i na menších displejích.

Požadovaný vzhled aplikace

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

Upozornění - Vývoj reálného firemního projektu v praxi

A je to tady! V tomto unikátním kurzu budeš pracovat na reálném firemním projektu a po jeho absolvování se staneš panem programátorem! Díky tomu je samozřejmě kurz i mnohem náročnější než vše, co jsi doposud potkal. Výukové kurzy jsou ve většině případů uměle udělané tak, abys pochopil nějakou úzkou problematiku a nemátly tě dalšími tématy a ze začátku to je tak i efektivní. V tomto kurzu už ale nevytvoříš appky alá "TODO" nebo "evidence knížek, co mám doma", ale plnohodnotný komerční software, za jehož tvorbu firmy reálně platí šestimístné částky svým zaměstnancům. Na projekt se také vztahuje licence Premium no-reselling, takže jej není možné zveřejňovat jako zdrojový kód nebo přeprodávat.

Co je jinak?

Počítej s tím, že už ne úplně vše ti napoprvé půjde. Cílem kurzu je podívat se jak se programuje ve firmách a pochytit z toho co nejvíc. Cílem tedy výjimečně není pochopit vše a už vůbec ne to napsat, spustit a čekat, že vše bude napoprvé fungovat. Lekcí je opravdu spoustu, budeš dělat překlepy, budeš mít projekt v jiném stavu než je v kurzu, něco jinak pochopíš apod. Na zdolání kurzu je naštěstí jednoduchý postup:

  • Zkontroluj si minimální požadavky - Prvně se ujisti, že máš za sebou kurzy zmíněné v pasáži "Minimální znalosti". Jestli ti nějaký chybí, nemáš bez něj tento kurz šanci projít a prvně si jej absolvuj. Pokud minimální požadavky splňuješ, nemusíš se bát, že to nezvládneš! :)
  • Drž se řešení, která používá kurz - Nesnaž se odchylovat od kurzu použitím vlastního řešení, při komplexnosti kurzu by mohlo být nekompatibilní s další budoucí implementací a připravuješ se také o možnost používat řešení vzorová. Upravit projekt si můžeš po skončení kurzu.
  • Používej záchytné body - Až budeš mít s něčím problém (a to se při komplexnosti a délce kurzu stane a neznamená to, že jsi špatný ty ani kurz), každých několik lekcí je dole ke stažení funkční projekt jako záchytný bod. Ten si stáhni a najdi si chybu v tom svém nebo, pokud se ti to nepodaří, pokračuj s tímto staženým projektem.
  • Využívej pomoc komunity - Dále můžeš využít možnosti komentářů (přečíst si komentáře ostatních na dané lekci, zda již někdo podobný problém neřešil, nebo napsat vlastní). Ve firmě ti s vývojem také někdo ze začátku pomůže a budeš se ptát, nedáš všechno hned sám. Zde za kolegy suplují záchytné archivy a diskuze.

Máš jedinečnou šanci zkusit si, jak to reálně vypadá, a dovršit své junior znalosti na uplatnitelnou úroveň nebo prohloubit své znalosti až na medior úroveň. Jeden život, jedna šance, pojďme na to!

Požadavky na znalosti

Tento projekt je na pomezí junior/medior co se týká levelu znalostí. V rámci levelu znalostí Junior se předpokládá spíše orientace v tomto větším reálném C# projektu, než že budete úplně všemu rozumět. Pokud byste chtěli detailně pochopit veškerý kód, pomohou vám znalosti v rozsahu Medior-level.

Junior-level znalosti

V rámci levelu znalostí Junior se předpokládají znalosti v tomto rozsahu:

Medior-level znalosti

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

Pokud byste chtěli detailně pochopit veškerý kód, pomohou vám ještě následující znalosti, nicméně počítejte s vyšší časovou náročností:

Začínáme

Tutoriál je psán pro verzi Core 3.1. Pokud tuto verzi nainstalovanou nemáte, můžete si stáhnout ze stránky se všemi SDK.

Pozor, dodržuj přesné verze komponent! Pokročilé projekty jako tento jsou složené z komponent. Možná by tě napadlo použít nejnovější verzi nějaké komponenty, co zrovna včera vyšla. Projekt ti pak ale bez odborné úpravy pravděpodobně nebude fungovat! U verzí komponent neplatí jako např. u aktualizace Windows, že chceme každý den používat tu nejnovější. Neustálé aktualizace všeho by totiž vyžadovaly každodenní a komplexní změny kódu projektu a reálně se tak neprovádějí. Ze stejného důvodu i my aktualizujeme kurzy v pravidelných intervalech a nové verze k sobě pak sladíme tak, aby vše fungovalo.

Ve Visual Studiu si vytvoříme nový projekt typu ASP.NET Core Web App (Model-View-Controller) (já budu pracovat ve Visual studiu 2019 Community Edition - potřebujeme verzi alespoň 16.4+):

Vytvoření MVC projektu v eshopu ASP.NET Core

TargetFramework zvolíme .NET Core 3.1. a Authentication Type vybereme Individual Accounts:

Vytvoření projektu-Additional v eshopu ASP.NET Core

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 bychom se dostali do bodu, kdy bychom psali podobné metody znovu a znovu místo toho, abychom parametrizovali nějakou existující, protože bychom 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ě viewmodely, kontrolery a pohledy. A také další části, které patří k webové aplikaci - CSS styly, skripty, obrázky apod.

Aplikační vrstva

Aplikační vrstvu již máme. Jedná se o projekt Eshop.

Business vrstva

Založíme business vrstvu. Bude se jednat o projekt Eshop.Business.

V okně Solution Explorer klikneme pravým tlačítkem myši na Solution a Add, pak New Project.... V okně Add a new project zvolíme Class Library nebo Class Library (.NET Standard) v závislosti na nabídce Visual Studio. V případě první možnosti cílovou platformu knihovny .NET Standard 2.0 vybereme až v posledním kroku. Druhou možnost volíme, pokud nám Visual Studio nenabízí jen obecnou Class Library, ale již přímo i s volbou platformy, poslední krok zde již potom není.

Po založení projektu Eshop.Business klikneme pravým tlačítkem na projekt Eshop.Business, vybereme Properties a zkontrolujeme, že cílová platforma knihovny TargetFramework je vybrána .NET Standard 2.0:

Založení Business projektu v Eshopu ASP.NET Core

Automaticky vytvořenou třídu Class1 odstraníme.

Datová vrstva

Obdobně založíme datovou vrstvu. Projekt se bude jmenovat Eshop.Data.

Zkontrolovali jsme cílovou platformu knihovny TargetFramework .NET Standard 2.0 a odstranili třídu Class1.

Nastavení referencí

Abychom mohli v jednom projektu využívat objektů z jiného projektu, musíme si nastavit reference.

Reference z Eshop.Business na Eshop.Data

Nastavíme si referenci z business projektu na datový projekt. V okně Solution Explorer klikneme pravým tlačítkem myši na business projekt Eshop.Business a vybereme Add, a pak Project Reference.... V levé části okna vybereme Projects a zaškrtneme datový projekt Eshop.Data:

Přidání reference na projekt v e-shopu ASP.NET Core MVC

Po kliknutí na OK klikneme na projekt Eshop.Business, kde v <ItemGroup> uvidíme <ProjectReference> na Eshop.Data.

Reference z Eshop na Eshop.Business a Eshop.Data

Protože naše aplikace bude ještě v udržitelném rozsahu, nebudeme v business vrstvě využívat žádné DTO nebo DAO modely. U ještě větších aplikací bývá aplikační vrstva od datové úplně odstíněna. My si nastavíme referenci z aplikačního projektu na business i datový projekt.

V okně Solution Explorer klikneme pravým tlačítkem myši na aplikační projekt Eshop a vybereme Add, a pak Project Reference.... V levé části okna vybereme Projects a zaškrtneme business projekt Eshop.Business a datový projekt Eshop.Data:

Přidání reference na projekty v e-shopu ASP.NET Core MVC

Po kliknutí na OK klikneme na projekt Eshop, kde v <ItemGroup> uvidíme <ProjectReference> na Eshop.Business a Eshop.Data.

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ůžeme vidět na obrázku:

Struktura řešení

Význam složek se dá většinou odvodit z jejich názvu. Složky si teď nebudeme vytvářet. Budeme si je zakládat postupně. V kurzu bude vždy zmíněno vytvoření složky.

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 connection string, správu migrací, provedeme úpravy před generováním databáze a nastavíme vzhled naší webové aplikace.


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 65x (1.02 MB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

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

 

 

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

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
Avatar
Martin Petrovaj
Redaktor
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
Redaktor
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
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Daemmon
Člen
Avatar
Daemmon:4.4.2019 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.4.2019 16:02
Avatar
Virtual
Super redaktor
Avatar
Virtual:4. února 19:51

Z téhle lekce mám víc výpisků z komentářů pod článkem... :-D
Super vysvětlení vrstev! Díky

Odpovědět
4. února 19:51
Rozdíl mezi tím, kým jsme a tím, kým chceme být, je jen v tom, co děláme.
Avatar
Karol
Člen
Avatar
Karol:24. března 22:00

Pre business a datovu vrstvu sa ma pouzit Class Library (.NET Standard 2.1) alebo sa ma pouzit Class Library (.NET Core 3.1) ???

Podla pripojeneho projektu a podla popisu v tutoriali to ma byt Class Library (.NET Standard 2.1) ale podla komentaru od Martin Petrovaj by sa mal pouzit Class Library (.NET Core 3.1)

Osobne by som cakal, ze sa pouzije Class Library (.NET Core 3.1).
Moze to prosim niekto z itnetwork teamu ujasnit co mame zvolit a preco?

Editováno 24. března 22:00
 
Odpovědět
24. března 22:00
Avatar
David Novák
Tým ITnetwork
Avatar
Odpovídá na Karol
David Novák:30. března 11:36

Jako Class library u datového i business projektu zvol Target Framework .NET Standard 2.0. Na .NET Standard 2.0 jsou oba projekty v rozsahu všech kapitol Testování úspěšně testovány.

 
Odpovědět
30. března 11:36
Avatar
Miloslav Soukup
Redaktor
Avatar
Miloslav Soukup:21. července 3:16

Mě by zajímalo, kolik lidí na takových projektech reálně ve firmách pracuje?

 
Odpovědět
21. července 3:16
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 18. Zobrazit vše