Jedna z tém, ktoré sa budú v blízkej budúcnosti asi často objavovať je .NET Core. Jeho multiplatformovosť je veľká výhoda a vo väčšine príkladov Microsoft spomína jeho uplatnenie ako platforma pre nenáročný a spoľahlivý webserver hostovaný napríklad na Linuxe.
Microsoft ale s príchodom .NET Core ohlásil, že ďalej nebude podporovať ASP.NET Web Forms. WebForms má dni svojej slávy už jednoznačne za sebou, ale v Strednej Európe je tento framework stále obľúbený a mnoho veľkých firiem má na ňom postavené svoje interné informačné systémy a webové aplikácie. Podporovaný ale nebude a na .NET Core tým pádom prichádza do úvahy len použiť prezentačný framework ASP.NET MVC, ktorý zostal ako jediná podporovaná webová technológia.
ASP.NET MVC 6, na .NET Core nazvané ASP.NET MVC 1.0 Core prináša niekoľko veľmi príjemých zmien. Aj keď je pomerne komplexný, stále dovoľuje veľkú flexibilitu pri návrhu architektúry webovej aplikácie. Od komplikovaných Controllerov, ktoré sa starajú takpovediac o každý aspekt správania a vzhľadu stránky, až po minimalistické WebAPI, ktoré podporuje základné CRUD operácie a zbytok aplikácie tvorí HTML/Javascript. Už dlhšiu dobu naberajú na popularite javascriptové frameworky ako AngularJS, Knockout, React a Vue a celá zoo ďalších. Tieto frameworky ale žiadnu extra prezentačnú vrstvu na strane servera nepotrebujú, naviac server-side logiku zastane napríklad Node.js. Výsledkom je, že C# akoby vo webovom prostredí strácal pozíciu v prospech JavaScriptu. Oproti tejto konkurencii sa ASP.NET MVC snaží prinášať nové vymoženosti, ktoré by .NET vývojárov zaujali a uľahčili im život.
Na druhej strane barikády stojí Tomáš Herceg so svojou firmou Riganti, ktorí majú za cieľ ponúknuť alternatívu k MVC. Hľadali nástroj, z ktorého pomocou by dokázali vyvíjať užívateľské rozhrania podobne pohodlne ako vo WPF a naviac bol zrozumiteľný pre programátorov zvyknutých na ASP.NET Web Forms. Svoj framework DotVVM postavili na návrhovom vzore MVVM. Jeho základnú štruktúru tvorí View-model napísaný na strane servera v C# a view v HTML obohatenom o koncept data-bindingov.
MVC je už rokmi vyskúšaný framework, ktorý Microsoft vylepšil a priniesol ako prvú voľbu webového vývoja na .NET Core. Naproti tomu DotVVM je novinka, ktorá je vo vývoji necelé dva roky a zdanlivo ide proti prúdu: snaží sa minimalizovať písanie JavaScriptu a má plnú podporu pre .NET Core. Samozrejme celý kód je otvorený a do projektu je možné prispieť na GitHube. Myslím, že stojí za to si ho predstaviť ako sľubnú alternatívu.
Štruktúra projektu
Oba projekty majú štruktúru, typickú pre .NET Core webový projekt. Rozdelenie do adresárov zodpovedá použitej architektúre. Program.cs a trieda Startup je v obidvoch zhruba rovnaký až na jeden riadok, ktorý nastaví príslušný framework ako middlewere. Pri DotVVM je špecifická konfigurácia vyčlenená do samostatnej triedy, MVC má svoju špecifickú konfiguráciu priamo v súbore Startup.cs. MVC používa ako svoje views súbory s príponou cshtml ktoré sú písané v markupovom jazyku Razor, DotVVM svoje .dothtml views písané vo vlastnom obohatenom HTML.
Najväčší rozdiel je v tom, ako je v oboch frameworkoch riešený code-behind. Základným stavebným kameňom architektúry MVC je Controller. Je to bezstavová trieda, kde každá metóda odsluhuje jedno volanie na webserver. Jeden Controller obsluhuje viacero stránok a združuje metódy obsahujúce podobný typ požiadavkov. Metóda príjme dáta poslané na server, spracuje ich, vyberie a vráti správne view, ktorému poskytne dáta na zobrazenie. Controller samotný stavové zmeny na stránke neuchováva, ide o komunikáciu “požiadavka - odpoveď”. Akékoľvek stavové informácie musí programátor “ručne” získať z požiadavky na server.
Naproti tomu DotVVM využíva výhody MVVM. Jeden view-model obsluhuje pri požiadavke na server len jednu stránku. DotVVM View je so svojím view-modelom pevne zviazané. View-model si naprieč požiadavkami uchováva kompletný stav svojej stránky. Takto združuje nielen dáta (properties) s ktorými stránka pracuje, ale aj funkcie. Tie zodpovedajú operáciám, ktoré možno na stránke vykonať, napríklad klik na tlačidlo. Ak užívateľ vykoná na stránke operáciu a spustí sa funkcia vo view-modely, táto funkcia má k dispozícií všetky dáta view-model triedy už pripravené tak, ako ich vidí užívateľ na stránke.
Mapovenie ciest
ASP.NET MVC Core má bohaté možnosti konfigurácie mapovania požiadaviek na server na akcie príslušných Controllerov. Je možné nastaviť mapovanie priamo v triede Startup.cs a držať si tak celú konfiguráciu ciest pokope. Tiež je možné jednotlivým Controllerom predpísať ich cestu atribútom. To isté platí pre akcie. Platí že atribúty akcií majú väčšiu váhu, ako atribúty Controllera. Taktiež je možné v atribúte použiť parametre [controller] a [action], ktoré dosadia meno aktuálneho Controllera a akcie.
Jediná možnosť ako v DotVVM nastaviť mapovanie ciest, je priradiť pomenovanú cestu konkrétnej .dothtml stránke v konfigurácií DotVVM a tak spárovať požiadavku na server so stránkou, ktorá sa má spracovať ako odpoveď. Pridávať cesty ručne by bolo na veľkých weboch pomerne nepraktické, našťastie je možné využiť možnosť rozšíriteľného auto-discovery, ktorá na základe konkrétnej stratégie .dothtml stránky nájde a namapuje na cesty. Základná stratégia namapuje stránky v priečinku “Views” podľa podpriečinkov.
Aj DotVVM aj MVC podporujú premenné parametre v adrese. Stačí ich uviesť v konfigurácií cesty a oba frameworky sa už postarajú o ich správne mapovanie.
V MVC prídu nachystané so správnym typom do parametrov akcií Controlleru podľa mena a atribútu [FromRoute]. V DotVVM view-modely ich treba získať zo slovníka Parameters objektu Context, ktorý je dostupný na štandardných DotVVM view-modeloch. Správny typ, dostupnosť a názov parametru si ale musí programátor postrážiť sám.
Views
Filozofia písania views v MVC by sa dala zhrnúť slovom minimalizmus. Dať programátorovi sadu základných funkcií a nechať ho nech si funkcionalitu stránok tak povediac “od podlahy” navrhne sám. Razor využíva priamu kombináciu C# kódu a HTML, nič neskrýva a tagy vykresluje jedna k jednej. Pri zostavovaní výsledného HTML sa dajú používať takmer všetky konštrukcie zo C# vrátane podmienok a cyklov. Dáta poskytnuté Controllerom na vykreslenie sú prístupné vo vstavanej premennej Model alebo slovníku ViewData. Na najčastejšie používané HTML konštrukcie existujú špeciálne funkcie - HTML helpery, ktoré podľa zadaných parametrov vykreslia HTML do stránky. Ide o jednoduchý priamočiary nástroj bez vnútornej logiky a väčšinou vykresľuje konkrétny HTML tag.
Znovupoužiteľnosť a prenositelnosť kódu zaisťuje špeciálny typ views - Partial views. Ide o typ view, ktorého úloha je vykresliť len časť stránky. Partial view má vlastný model a ViewData. Partial view je možné vykresliť do ľubovoľného iného view, a predať mu kompatibilné dáta. Je možné tiež vrátiť Partial view ako výsledok volania na Controller a dá sa takéto volanie vynútiť pri samotnom zostavovaní view v ktorom sa Partial view používa. Tento mechanizmus je veľmi dobre možné využiť na vytváranie prenesiteľných znovu použiteľných sád Partial view. Views sa zostavujú ako textové súbory priamo bez akejkoľvek klientskej logiky. Nevýhodou je že pri zmene dát alebo požiadavke na server (napr.: odoslaní formulára) dát sa musí spraviť plnohodnotné volanie na server a celá stránka sa musí prekresliť s novými dátami. Dnes takéto priame vykresľovanie chce málokto a logika sa deleguje z Controllera na JavaScript na strane klienta s čím ale ASP.NET MVC príliš nepomôže.
DotVVM má v mnohom filozofiu presne opačnú. Snaží sa čo najviac programátora odbremeniť od písania klientskej logiky v JavaScripte aj za cenu toho, že pred ním implementačné detaily ukryje. DOTHTML markup ktorým sú views písané sa narozdiel od markupu Razor snaží minimalizovať C# kód v samotnom view. View je písaný v štandardnom HTML rozšírenom o sadu vlastných tagov s prefixom “dot:”. View ktoré navrhujete sa ale bude líšiť od reálne vykreslenej stránky. DotVVM zavádza totiž koncept Controls. Celé view je tvorené kontrolkami, ktoré majú každá svoju vnútornú javascriptovú logiku a definovaný spôsob, akým sa vykesľujú. Do jednoduchých kontroliek ako napríklad TextBox, ktorý vykreslí len jeden <input> tag napojený na view-model, až po komplexné ako napríkad GridView, ktorý vykreslí zo zadanej kolekcie dát z view-modelu tabuľkový prehľad s možnosťou úpravy riadkov, radenia a stránkovania. Dáta z view-modelu sa do kontroliek vo view jednosmerne alebo aj obojsmerne naviažu pomocou “data-bindingov” vo view. Používa sa na to syntax inšpirovaná desktopovým prezentačným frameworkom WPF. Data-bindingy podporujú jednoduché C# výrazy, ktoré uľahčujú naviazanie dát ale riadenie toku programu a zložitejšie C# konštrukcie nepodporujú.
Výhodou DotVVM je, že pri požiadavke na server sa neprekresľuje celá stránka, ale naspäť sa pošle len zmena view-modelu a prípadne HTML ktoré sa zmenilo. Komunikáciu zo serverom tok dát medzi medzi kontrolkami view rieši DotVVM interne. Dáta view-modelu sú naviac dostupné ako javascriptové objekty takže napojenie vlastnej javascriptovej logiky nie je problém. Okrem využívania kontroliek, ktoré sú súčasťou samotného frameworku je samozrejme možné vytvoriť aj vlastné kontrolieky a zaregistrovať ich v rámci DotVVM, alebo ich distribuovať buď ako knižnicu DLL. To podporuje scenár, kedy skúsený team vývojárov vyvýja sadu všeobecne použiteľných kontroliek zatiaľ čo menej skúsený team ich potom využíva a zostavuje weby podľa požiadaviek zákazníka.
Nevýhodou je, že na pozadí každého view je logika ktorú nie je na prv pohľad vidieť a treba s ňou rátať a porozumieť jej. Dá sa požívať aj ako "black box", ale náročnejšie scénare to už nestačí. Ale framework ako taký stále dokáže ušetriť veľkú časť repetitívneho klientského aj serverového kódu, obzvášť pokiaľ web obsahuje zložitejšie procesy, alebo wizardy.
Záverom
V tomto článku som predstavil základné vlastnosti ASP.NET MVC od Microsoftu a frameworku DotVVM od firmy Riganti ako dve alternatívy pre webový vývoj na .NET core. MVC sa snaží o základnú abstrakciu interakcie so serverom a návrh webu skrze priamočiare a transparentné nástroje a všetko ostatné necháva v rukách programátora.
Ako alternatíva DotVVM sa snaží riešiť čo najviac z bežných úloh pri návrhu “line of business” aplikácií a tak programátorom ušetriť čas a peniaze. Naviac poskytuje dostatočnú modularitu a rozšíriteľnosť.