ASP.NET WebForms vs. Modern Webalkalmazás?

Az ASP.NET WebForms, hogy kicsit szabadosan fogalmazzak szívás!


Tegyük fel hogy szeretném a világ legjobb Webes alkalmazását létrehozni .NET környezetben, ami:

  • könnyen kiterjeszthető
  • könnyen módosítható
  • a felhasználói számára könnyen kezelhető
  • könnyen testre szabható
  • nem utolsó sorban megfelel a mai kor technikai és felhasználói elvárásainak


Én azt állítom, hogy az ASP.NET WebForms erre nem alkalmas eszköz.
A ViewState, a Postback, a Modulok (Pluginok) összehangolt kezelése csak nagy nehézségek árán érhető el vele.


A gond a WebForms-sal hogy nem erre tervezték, bármennyire is igyekszik az ember szépíteni, nem lehet vele olyan moduláris webalkalmazást felépíteni ami megfelel a következő kritériumoknak:
  • Zárt Alkalmazás API,
  • Független Modulok
  • Dinamikusan Betöltött  Modulok (Plugin)
  • Központi Futtatási környezet

Zárt Alkalmazás API:

A legfontosabb megoldandó probléma az üzleti logika definiálása, a modulok interfészeinek definiálása.

Ez ideáig stimmel, sehol sincs ASP.NET a képben.

Független Modulok:

Kezd kissé problémássá válni a helyzet, de nem megoldhatatlan...
Elsőként mi is a modul, mit várunk el tőle?

A Modul olyan alkalmazás rész ami a Core.API-ra épülve annak erőforrásait felhasználva valami hasznos dologgal egészíti ki az alkalmazást.

No de, ha ASP-NET-ről beszélünk akkor elengedhetetlen hogy a kiegészítés mind Üzleti Logika mind pedig Felhasználó felületen megoldható legyen.

Ehhez vegyük hozzá az ASP.NET WebForms felépítését
(gyk: Control Fa -> ViewState -> Postback)
Hogy egy Nyomógombot helyezzünk el a Modul egyik űrlapján biztosítani kell hogy Postback esetében az adott Control a Postback feldolgozásakor is példányosítva legyen.

(Tehát pl. nem lehet a Modul control-t ASP.NET Cache-elt controlba beágyazni, csak akkor ha a beágyazáskor figyelembe vesszük a postback követelményeket is... Ugyanígy kell eljárni akkor is ha N mélységben ágyazunk be Controlokat egy Cache-elt Controlba)


Ha az adott Controlt dinamikusan hoztuk létre egy Másik Control értékére alapozva, a vonatkozott control inicializálása, és felépítése meg kell hogy előzze az adott Modul control felépítését.

Ez utóbbi a ViewState feladata. Mondhatnánk, hogy meg van a megoldás, de sajnos nem teljesen igaz:

Az ASP.NET control inicializálás, kiértékelés több mint nagy figyelmet igényel a Modul felhasználói felületének megtervezésekor.

Elméletben a Modul független. Modulon belül hegesztéssel megoldható a korrekt inicializálás, de a később kifejtett futtatási környezet erről semmit se tud.

Dinamikusan Betöltött Modul - Plugin:

Az adott modul ideális esetben teljesen független minden más modultól, és kizárólag az API-ra épül.
Egy adott modult ideális esetben az API-ra alapozva mások / máskor is létrehozhatnak.


Ezeket a modulokat amit nevezzünk plugin-nak Reflection-nel be lehet tölteni, feltéve hogy a modulok definíciója az API-ban megtörtént.

Így a Runtime az adott interfészeken keresztül tud kommunikálni a Plugin-nal.


De,
mivel ASP.NET-ről van szó biztosítani kell a felhasználói felületet.

Hogyan lehet elérni:
Definiáljunk a Modul ős Controljait a Core.API-ban és rendereljük adott Controlt az ősön keresztül amikor szükséges.

Hogy a kép árnyaltabb legyen, az ASP.NET compiler bizonyos esetekben eléggé szűkszavú tud lenni ami a hibaüzeneteket illeti.


Központi futtatási környezet:

Kell egy webalkalmazás ami az egész rendszer számára biztosítja a példányosítást minden esetben.
(Vizuális felületnél az oldallekérés és postback, üzleti logika esetében pedig az adott szolgáltatások hostolása)

Ezt végezze el mind az API, mind pedig a Modulok / Pluginok esetében


Biztosítsa a lehetőséget hogy a felhasználói felületet dinamikusan építsük fel (CMS)


És a legfontosabb, stabilan valamint skálázhatóan működjön.






Hogy mi is a probléma a fenti rendszerrel?

Működőképesség: megoldható

Átláthatóság: az üzleti logika mindenképpen átlátható, DE
ott van az a fránya ASP.NET WebForms
a Control-jainak az életcikusával, a ViewState-tel és a Postback-kel


Az ASP.NET oldala sajnos mindennek nevezhető csak átláthatónak nem.
Mert az adott modulok Felhasználói felületének működése
  • Függ attól hogy hogyan vannak beágyazva a szölő control-okban.
  • Függ attól hogy hogyan építettük fel a controlt a postbacket megelőzően.
  • Függ a Control ViewState-től (ami nem ér semmit ha nem építettük újra a control fát a posback feldolgozása közben).
  • Nem utolsó sorban függ a szülő Control postback/viewstate feldolgozási állapotától.


Emberi erőforrás igény: legyen egy csapat aki képes időben megoldani, illetve ledokumentálni a fentebb említett rendszert.



Hogy mi lehet a megoldás?!

Az üzleti logika eléréséhez
Rest WCF szolgáltatások a postback "szolgáltatások" helyett...
vagy
Soap WCF szolgáltatások a postback "szolgáltatások" helyett...

Bővebben itt MSDN - WCF


A felhasználói felület definiálására
ASP.NET MVC a WebForms helyett...
vagy
Castle Monorail (Spark View enginnel) a WebForms helyett...

Bővebben itt
ASP.NET MVC
Castle Monorail és Spark View Engine

vagy...


???


Ez egy nem egyszerű kérdés,



Véleményem szerint aki ezt most megoldja azé lesz a jövő generációs web programozása Windows .NET környezetben...



Akármi is lesz a megoldás időtálló megoldás kell!
Az elfogadhatatlan hogy az ember épp mire befejezte a "Nagy" projektet lehet is kezdeni az újraírást mert épp egy újabb technológia jön be és az MS. szépen csendben megszünteti a régebbi technológia támogatását... (épp ahogy történt az asmx webszervízzel napjainkban MSDN WebService (asmx))




Addig is "gyönyörködjük" az ASP.NET webforms lassú kínhalálában...



Happy Coding