Asp.Net 2 - Kompilace
Kompilace v Asp.Net verze 1.1
Pro zjednodušení budu popisovat pouze příklady, kdy aplikace má oddělený zdrojový kód (např default.aspx.cs
)
od vzhledu stránky (default.aspx
). Webová aplikace používající codebehind je rozdělena do několika assemblies.
Ze tříd které obsahují chování webové aplikace - tj. codebehind stránky (default.aspx.cs
a další)
se vytvoří jedna assembly - na obrázku je pojmenovaná TestAssembly.dll
(ve Visual Studiu si toho člověk ani
nevšimne, ale při psaní v notepadu je potřeba ručně vytvořit tuto assembly). Tato assembly je poté uložena v adresáři
bin
. Pokud ve webové aplikaci jsou i UserControls, tak ty se chovají úplně stejně jako webové stránky,
takže i jejich codebehind třídy jsou zkompilovány v této assembly. Jednou z nepříjemností, která bude rozhodně v
dalších verzích Asp.Net odstraněna je, že v codebehind třídě je potřeba nadeklarovat všechny ovládací prvky, které
na stránce jsou (respektive měly by být), aby je člověk mohl používat (viz testButton
na obrázku).
Assembly na obrázku pojmenovaná xyz.dll
je automaticky generována Asp.Net při prvním požadavku na stránku. Obsahuje třídu, která zajistí vytváření
všech ovládacích prvků na stránce a výpis dalšího, na pevno napsaného html kódu v aspx
souboru.
Tato assembly je schovaná někde v adresáři C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\Temporary ASP.NET Files
a ve stejném adresáři je i stejně pojmenovaný cs
soubor, který obsahuje její (vygenerovaný) zdrojový kód.
V kódu této assembly jsou také přiřazeny reference na ovládací prvky nadeklarované v bázové třídě
(z tohoto důvodu musí být alespoň protected
).
Kompilace v aktuální beta verzí (beta 1)
V beta verzi, která je nyní dostupná se kompilování docela dost změnilo, ale vzhledem k tomu, že podle dostupných informací se vše v další beta verzi (verze beta 2, která by doufejme měla být již velmi podobná finální verzi) zase změní, tak o aktuální verzi nebudu vykládat přiliš podrobně, nicméně za zmínku to myslím stojí.
Velkou změnou je, že v této verzi úplně zmizela jedna "vrstva" a to codebehind assembly. Asp.Net tedy při prvním
požadavku do jedné assembly zkompiluje jak kód vygenerovaný z aspx
souboru, tak i ze souboru napsaného
programátorem (dříve codebehind třída). Toto je možné díky nové konstrukci v C# nazvané partitial classes.
Třída je tedy rozdělena do dvou souborů, jeden napsaný programátorem a druhý generovaný Asp.Net.
Tato změna výrazně zpřehledňuje zdrojový kód, protože odpadá všechen kód, který doposud generovalo Visual Studio.
Následující velmi jednoduchý kód ukazuje jak vypadá zdrojový soubor ke stránce obsahující jeden ovládací prvek typu Label
:
public partial class Default_aspx { private void Page_Load(object sender, EventArgs e) { lblHello.Text="Hello World!"; } }
Nicméně toto řešení bylo (v reakci na kritiku zákazníků :-)) změněno. Nejsem si jistý, do jaké míry to je tím, že je řešení špatné a do jaké míry je to tím, že se programátorům nelíbí moc velké změny. Na první pohled se sice zdá, že jedna chyba je nutnost nahrávat na server s aplikací i kompletní zdrojový kód, jenže to není pravda, protože díky (nové) možnosti tzv. precompilation, není nutné na server nahrávat vůbec žádný zdrojový kód.
A jak to bude ve finální verzi?
Ve finální verzi se pro změnu způsob kompilace velmi podobá tomu z Asp.Net 1.1 (Pokud tedy ve finální verzi vše zůstane tak,jak by to podle dostupných informací mělo být ve verzi beta 2). Mimochodem docela mě překvapilo, že někdo z vývojového týmu v Asp.Net fórech popíše jak převést stránku z verze beta 1 na verzi beta 2 a místo toho aby přesněji popsal proč a jak přesně se změní chovaání napíše komentář: "Confusing isn't it? The good news is that this is an implementation detail you don't need to understand". Myslím si totiž, že to jak se kompilují Asp.Net stránky rozhodně neni implementační detail a pokud to člověk myslí s Asp.Net vážně musí toto pochopit.
Zdrojový kód ve verzi beta 2 vypadá sice skoro stejně, ale ve skutečnosti je vše zase jinak (tučně je pro zajímavost odlišeno těch pár nepatrných změn):
public partial class Default_aspx : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { lblHello.Text="Hello World!"; } }
Ve verzi beta 2 se bude opět generovat jedna codebehind assembly. Ve této assembly budou bázové třídy a od nich budou
odvozené třídy, které Asp.Net vygeneruje z aspx
souborů. (Že by dejavu, neboli chyba v Matrixu?).
Jedinou podstatnou změnou oproti Asp.Net 1.1 je, že zdrojový kód psaný programátorem nemusí obsahovat deklarace všech
ovládacích prvků na stránce a přiřazování event handlerů (doposud generováno Visual Studiem), protože soubor
s tímto kódem bude k partitial třídě vygenerován automaticky (jenom se mi zatím nikde nepodařilo zjistit, zda tento
luxus budou moci využívat pouze programátoři s Visual Studiem, nebo tento soubor bude nějakým způsobem generovat
samotné Asp.Net).
Na závěr se tedy zdá, že přes poměrně bouřlivé změny bude kompilace probíhat více méně stejně jako v aktuální
verzi a jediný rozdíl bude, že psaní kódu bude pro programátory snažší a přehlednější. Další zajímavá věc, která
se spíš jen rýsuje na obzoru, je možnost předkompilovat všechny stránky (a ascx
ovládací prvky).
Toto by mělo přinést možnost nekopírovat na server žádný zdrojový kód, ale také by díky této funkci mělo jít
naráz objevit všechny syntaktické chyby ve zdrojových kódech zapsaných v aspx
souborech.