Témata, která by měla na přednášce zaznít, najdete v moji prezi,
která je je k nahlédnutí již nyní v její rané vývojové fázi. :)
Přesně v agilním duchu Continuous Delivery.
Samozřejmě jsem otevřen připomínkám a námětům, co by vás –
případné účastníky – zajímalo.
Máte nějaké dotazy ohledně vývoje v ASP.NET potažmo v .net obecně?
Máte chuť se seznámit s dalšími lidmi, kteří se dotnetem zabývají,
nebo jen chcete osobně potkat lidi, které znáte jen virtuálně? Budete
v sobotu 17. Října na WebExpu 2009?
Pokud jste alespoň na jednu z výše položených otázek odpověděli
kladně, přijďte se podívat na Community meeting
.net, kde najdete Štěpána Bechynského a moji maličkost. Můžete se
nás zeptat na cokoli o ASP.NET a dalších dotnet technologiích a pokud to
bude v našich silách, tak vám odpovíme. Štěpán slíbil, že součástí
meetingu bude i coolkeg s náplní od Staropramenu, tak kdo bude mít žížu,
tak ať si přinese vlastní pulitr, pokud nechce pít z plastiku…
Když mě začátkem léta oslovil Vašek Stoupa, jestli nechci přednášet
o ASP.NET MVC na WebExpu, měl jsem zprvu strach. Nikdy jsem
veřejně nepřednášel a z malých slideshow, které jsem dělal pro kolegy
nebo ve škole, jsem si byl jistý, že mé prezentační schopnosti nejsou
skoro žádné. Ale pak jsem si řekl, že zkusit bych to mohl, přinejmenším
je to dobrá zkušenost a raději jsem požádal Borka, aby se ke mně přidal. Proč? Protože
už jsem ho viděl přednášet na WebCampu a bylo to dobré.
Takže jsme se domluvili, že přednáška bude mít trochu širší záběr
než jen ASP.NET MVC, které v té době bylo pouze v ukázkových verzích.
V průběhu září jsme vymysleli nějakou osnovu, Borek
založil SVN repository a začali jsme připravovat prezentaci.
Nejprve jsem udělal ukázku na využití ADO.NET Data
Services ve spolupráci s ASP.NET AJAX
(tu najdete přibalenou). Krom toho, že ukazuje základy konzumace RESTových
Data Services, tak je i hezkou ukázkou toho, jak takové služby stavět nejen
nad Entity
Frameworkem, ale i nad ActiveRecord/NHibernate. No, ukázka není
úplně dokončená, protože jsem se jí přestal věnovat a už jsem nenašel
chuť jí dokončit, ale základní koncepce je snad pochopitelná – snažil
jsem se vše okomentovat.
Osobně nemám rád psaní zbytečného kódu. Nejsem zastáncem zbytečných
ukázkových aplikací, testovacích utilitek a tak. Takže už jsem žádné
další ukázkové aplikace nepsal a rozhodl se další možnosti ASP.NET
ukázat na již hotových aplikacích, se kterými mám něco společného.
Základní koncept komponent a Master pages jsem se tedy rozhodl ukázat –
ať nechodíme daleko – na šabloně tohoto blogu.
O něco pokročilejší komponentový framework jsem pak ukazoval na šabloně
obchody.atlas.cz. Tahle jedna šablona je
v podstatě celý web. Bez knihovny je sice mrtvá a ještě chyběj pravidla
URL rewritingu, ale jinak je tam vše. Tyhle dvě ukázky najdete taktéž
přibalené.
Poslední mou ukázkou byla aplikace, kterou jsem psal kvůli potřebě
naučit se ASP.NET MVC a ADO.NET Data
Services prakticky ještě před konferencí a zároveň abychom se
v práci zbavili nutnosti zapisovat si příchody někam na papír (formulář)
a pak na konci měsíce počítat, kolik kdo dostane stravenek :). Tak vznikla
docházka a taky rozcestník projektů a tím pádem základ
Twareg.Intranet. Shodou okolností to možná bude i naše
první komerčně prodávaná aplikace. Hezký osud bokovky…
Takže na tomto webu jsem se pokusil ukázat, jak se dělá routing, jak je
ten systém modulární. Jak deklarativně pomocí atributů nastavit autorizaci
k akcím a jak akce snadno přejmenovat. Na víc už moc nezbýval čas. Tahle
ukázka přibalená není. Namísto ní najdete Borkovy REST služby postavené
nad ASP.NET MVC, které jsme bohužel nestihli ukázat.
Co se týče mého vystoupení, tak moc spokojený nejsem, vůbec se to
nedostalo ani na spodní hranici mých představ o dobré přednášce –
naštěstí tam byl Borek, aby to zachránil.
Author Stream ty slajdy trochu
rozsypal, ale lepší než nic. Jinak pokud si chcete slajdy nebo ukázky
stáhnout, pokračujte na Slajdy a ukázky
z WebExpa. Pokud vás toto téma zajímá určitě najdete spoustu
zajímavých futures bits na
Codeplexu. Některá témata z přednášky bych rád rozebral podrobněji
tady na blogu, ale až někdy jindy.
Na tuhle akci jsem nejvíc těšil hlavně kvůli lidem. Já moc na tydlety
akce nechodím, ale jednou za čas se potkat s lidmi, které často čtu, není
špatné. Rád jsem osobně potkal i některé nové tváře, které jsem dosud
nečetl a třeba to napravím…
Na závěr
Na závěr patří především velíké díkyVaškovi, za velikou zkušenost, za
zorganizování téhle veliké party se spostou zajímavých osobností a se
širokým záběrem témat. Je dobré když se člověk může podívat na to
jak to dělaj jinde a něčemu se třaba přiučit nebo prodiskutovat své
pohledy na věc. Ono táhnout konferenci až do první hodiny ranní není
žádná sranda. Respekt!
Jo a málem bych zapomněl, na LinkedIn jsem vytvořil k této konferenci
skupinu, takže pokud jste se ještě do ní nepřidali, neváhejte a udělejte
to ještě teď. A pokud vás zajímají slajdy ostatních nebo chcte
nasdílet své, využijte eventu na slide
share.
Tento víkend jsem strávil na největší oborové konferenci o webu
u nás – na WebExpu 2008. Byla to konference, kde jste mohli potkat lid
nejrůznějších povolání – od marketingu přes management až ke
kodérům, programátorům a vývojářům. A samozřejmě jste nemohli minout
bandičku elitářských blogerů, které jistě znáte z Weblogy.cz.
Organizačně se mi konference líbila a poskytla mi i spoustu zajímavých
témat k poslechu, někdy až tolik, že jsem začal přemýšlet o tom, jak
využít mé rozdvojené osobnosti k tomu, abych pokryl více přednášek
najednou. Nakonec tato metoda nezafungovala, takže jsem raději zaplul
do šenku…
Nakonec jsem si odnesl spoustu zajímavých poznatků:
Radek Hulán je v pohodě a líbí se mi jeho pohled na web vs. Microsoft a
jeho hlas
Arthur Dent spal s Davídkem a velkým plyšovým
psem
Ruby je opravdu skvělé
rarouš je děsnej kořala a přednášení mu
fakt nejde
Davídek se ztratil
Díky Vaškovi za skvělou konferenci a snad se brzy sejdeme na nějaké
další ;)
Možná si říkáte, tady to umřelo, nic se neděje. Možná máte pravdu.
Je to tím, že poslední dobou toho mám docela dost. Krom příprav na
sobotní přednášku, jsem
se musel věnovat shánění a následnému stěhování a nyní už
i zařizování, což mě docela vytěžuje. :) Navíc v novém bytě ještě
nemám zaveden internet, tak jsem téměř mužem v off-linu.
K příležitosti WebExpa jsem si
vytvořil kalendář,
kde bych se chtěl nejspíš pohybovat, uvidíme, jak to nakonec dopadne.
No a když už se to tak blíží, tak Microsoft nezapoměl vydat beta
verzi ASP.NET MVC o němž chceme s Borkem povídat. Neni to jediný
release před konferencí, například vyšel i Silverlight 2 o němž bude po
nás povídat Štěpán Bechynský.
Vzhledem k tomu, že změny mezi Preview 5 a Beta verzí nejsou nikterak
veliké (stačí pár drobných úprav, aby vše opět běželo jak má, budeme
na přednášce tedy ukazovat už Betu. Já už jsem převedl moji ukázkovou
aplikaci. Ta bude aplikace našeho tuaregského intranetu, takže žádná
ukázková spatlanina, ale aplikace z reálného života. Dobré je, že na ní
můžu ukázat jak ASP.NET MVC, tak ADO.NET Data Service, které v projektu
také používám.
Tak pokud budete na WebExpu, tak mě nezapomeňte přijít pozdravit ;)
Pokud se rozhodnete pro vaše AJAXové aplikace požívat RESTové služby
ADO.NET Data Services, jistě se dostanete do situace, kdy máte komplexní typ
a potřebujete vytvořit novou entitu s odkazem na již existující
objekt.
Řešení tohoto problému jsem hledal dost dlouho, nakonec bylo celkem
jednoduché.
Problém
AJAXově vytvářím entitu, která má vlastnost User, což je
reference na uživatele, který danou entitu vytvořil –
kterému patří.
Cesta k řešení
Nejprve jsem zkoušel využít něco podobného, jako je u entit, které
jsou vráceny pomocí metody GET. Tedy odkaz na jinou entitu je vyjádřen
pomocí vlastnosi __deffered a ta má atribut uri,
který odkazuje na již existující entitu pomocí jejího URL. Bohužel, to nefungovalo,
protože __deffered je metodou POST ignorováno. Kód vypadal asi
následujícně:
User: { __deffered: { uri: "/Users(13)" } }
Pak jsem tedy zkusil druhý zoufalý krok. Zkusil jsem použít atribut ID,
který je vlastně jediný důležitý pro správné persistování do
databáze. Kód následující:
User: { Id: 13 }
Jenže ani to není správná cesta, navíc si tak můžete Usera
poškodit.
Konečné řešení
Konečné funkční řešení se od toho původního pokusu skoro neliší,
ano byl jsem hodně blízko a vzal to oklikou a až důkladné čtení
dokumentace mi otevřelo oči. Vlastnost __metadata byla aktuálně
tou správkou, která se měla použít! Takže správný kód
vypadá takto:
User: { __metadata: { uri: "/Users(13)" } }
Závěr
Já vím, není to žádná super extra informace, ale já k jejímu
získání spotřeboval celkem dost času. Možná to někomu ušetří starosti
a hledání… Pokud vás zajímají ADO.NET Data
Services – což je velice zajímavá technologie – můžete se
přijít podívat na naši přednášku
o ASP.NET, kde o nich bude utroušeno několik slov a předvedena pěkná
ukázka ve spojení s AJAXem a k databázi budeme přistupovat přes NHibernate místo Entity
Frameworku.
První vlašťovkou z hnízda MVC frameworku, která se objevila
v produkční verzi .net frameworku, je knihovna
System.Web.Routing. Objevila se s příchodem SP1 verze 3.5 a to
proto, že jí využívají ASP.NET Dynamic Data, které jsou taktéž novinkou
service packu. No a protože routing je důležitou součástí ASP.NET MVC a
jeho výhod lze využít i v klasickém ASP.NET, pojďme se na něj podívat
trochu blíž.
Jak to funguje
Základem routingu je HttpModul, který vezme URL adresu
požadavku a snaží se ho napárovat na některou z rout, které se
registrují při startu aplikace. Pokud najde, získá z adresy požadované
parametry a předá zpracování patřičnému RouteHandleru, který
má za úkol vytvořit HttpHandler a předat mu získaná data.
V případě MVC se vytvoří MvcHttpHandler a data se
přidávají kontextu, v klasickém ASP.NET je to jen na vás.
Routovací handler pro WebForms může vypadat třeba následovně:
publicclass WebFormRouteHandler<T> : IRouteHandler where T : IHttpHandler, new() {
publicstring VirtualPath { get; set; }
public WebFormRouteHandler(string virtualPath) {
VirtualPath = virtualPath;
}
public IHttpHandler GetHttpHandler( RequestContext requestContext ) {
foreach (var value in requestContext.RouteData.Values) {
requestContext.HttpContext.Items[value.Key] = value.Value;
}
return (VirtualPath != null)
? (IHttpHandler)BuildManager.CreateInstanceFromVirtualPath(VirtualPath, typeof(T))
: new T();
}
}
Routovací handler projde kolekci dat získaných z aktuální URL
požadavku, nacpe je do kontextu a nakonec vytvoří a vrátí
IHttpHandler.
Routovací tabulky
Pro naše aplikace je asi nejdůležitější nadefinovat routovací tabulky.
Definice tabulky se vytváří při startu aplikace, tudíž využijeme
události Application_Start v Global.asax nebo vlastním
HttpModulu.
Ukázka tvorby routovací tabulky při startu webové aplikace. Metoda
MapRoute je extension metodou z MVC frameworku, která za nás
vytvoří MvcHttpHandler, který bude požadavek zpracovávat.
Získané parametry z routy jsou: název řadiče, který přebere řízení,
jeho akce, která požadavek zpracuje a dále pak parametr id.
U WebForms by routovací tabulka např. pro můj blog mohla vypadat
následovně:
publicclass Global : System.Web.HttpApplication {
publicstaticvoid RegisterRoutes(RouteCollection routes) {
var routeHandler = new WebFormRouteHandler<Page>("~/Weblog/Article.aspx");
var route = new Route("weblog/{id}-{url}.aspx", routeHandler) {
Constraints = new RouteValueDictionary {
{"id", "\d{1-3}"}
}
};
routes.Add(route);
}
protectedvoid Application_Start(object sender, EventArgs e) {
RegisterRoutes(RouteTable.Routes);
}
}
Zaregistroval jsem do tabulky routu, která bere URL ve tvaru
weblog/{id}-{url}.aspx a ověřuje se, že id je jedno
až tříciferné číslo.
Shrnutí
„Pane Aloisi, když dovolíte, já bych si to v závěru celé
shrnul.“
„Tak, jestli vám to udělá dobře, tak si to celý schrntě.“
Tak tedy, tento spotík se snažil nastínit jak funguje routing v ASP.NET,
jak si zaregistrovat routy a jak z nich získávat data. Mohlo by se zdát, že
to je vše čeho jsme schopní dosáhnout, ale není tomu tak. Routing je
v ASP.NET dvoucestný, ale cestu zpět si ukážeme zas někdy příště…
Třeba na WebExpu!
Je to už pár měsíců, co mě oslovil Vašek
Stoupa, zda bych nechtěl přednášet na WebExpu o ASP.NET
MVC. Zprvu jsem váhal, protože nemám žádné
prezentační zkušenosti a tak jsem to chtěl celé hodit na Borka. Jenže pak jsem si
vzpomněl na skvělé přednášky z MIXu, kde nebyl pouze jeden
přednášející, ale tandem.
Slovo dalo slovo, Vašek i Borek souhlasili a my jsme zapsaní v programu
konference. :) Protože ASP.NET MVC ještě není ve stabilní formě API (ta by
měla být více méně stabilní v betafázi, která se blíží), domluvili
jsme se na tom, že probereme více věcí.
Doufám, že se Borek nebude zlobit, když prozradím naši předběžnou
osnovu. Můžete se k ní vyjádřit v komentářích a my ji můžete
případně vylepšit. :)
Osnova
WebForms – povídání o tom, kde je vhodné použít klasické WebForms
a novinkách ve verzi 3.5
AJAX – povíme si, jak je integrována podpora AJAXu v ASP.NET
ADO.NET Data Service – bližší seznámení s REST službami
postavenými nad ADO.NET a ukázka ve spojení s AJAXem
Dynamic Data – povídání a ukázka dynamicky vytvářených
administračních rozhraní ze schématu databáze.
MVC – povídání a ukázka MVC frameworku, jak se liší od WebForms a
možná i spojení s Dynamic Data, to jak zbyde čas.
Pokud vás tato témata zajímají, přijďte se na nás
podívat, pokud nezajímají, přijďte se podívat na koktajícího
rarouše… ;) Každopádně tam bude spousta jiných zajímavých přednášek,
třeba Davidův evergreen
o Nette Frameworku.