Klávesové zkratky na tomto webu - rozšířené Na obsah stránky

Jak funguje MonoRail

13.20 - 17. srpna 2007 | ASP.NET 2.0

Po letmém seznámení s frameworkem MonoRail (MR) je tu první část slibovaného seriálu. V dnešním díle se ponoříme do technických principů frameworku.

Základem MR je klasický IHttpHandler známý z ASP.NET, který se stará o zpracování požadavků přicházejících na server. Ve výchozím stavu zpracovává požadavky s příponou .rails, ale protože tato není na většině hostingů nastavena na ISAPI filtr ASP.NET, dá se nastavit zpracování přípony jiné (často ashx), která je webovému serveru známá a je spojená s ASP.NET filtrem.

Handler rozparsuje adresu a snaží se najít vhodný Controller a jeho metodu, která požadavek zpracuje a předá data na patřičný View. Vypadá to asi následovně. Na handler přijde požadavek ve tvaru /home/index.rails, handler se pokusí vyhledat třídu HomeController, která dědí ze třídy Controller, a u ní metodu Index(). Takže controller pro tento požadavek by vypadal asi následovně:

public class HomeControler : Controller {
  public void Index()  {
    PropertyBag["hello"] = "Pozdrav z jednokolejky";
  }
}

Takový controller by se měl nacházet v projektu ve složce controllers. Vlastnost PropertyBag je slovník (asociativní pole), který předává data z controlleru na view. Aby se nám to celé mohlo někde zobrazit, potřebujeme ještě tedy view. Ve složce /views/home/ si vytvoříme soubor index.brail (Brail je jedním z ViewEnginů) do kterého zadáme:

<html>
  <head>
    <title>Pozdrav</title>
  </head>
  <body>
    <h1>${hello}</h1>
  </body>
</html>

Řetězec ${hello} bude na výstupu nahrazen textem z PropertyBagu. Dolar složené závorky totiž prochází lokální proměnné a snaží se z nich získat hodnotu. Pokud taková proměnná neexistuje zavolá se metoda GetParametr, která projde kolekce PropertyBag, Flash, Request apod. a snaží se v nich nalézt klíč, kterým je text mezi závorkami. Hodnota je pak vypsána namísto dolarové funkce. :) Dolarová funkce je takový shortcut pro tento zápis: <?brail output hello ?> což je obdoba <?php echo $hello; ?> v PHP nebo <%= hello %> v ASP.

Celá skládačka do sebe zapadne, když do prohlížeče zadáme adresu http://server/home/index.rails. Díky příponě rails se požadavek předá Handleru MonoRail. Ten rozparsuje adresu a snaží se najít třídu HomeController, kterou jsme vytvořili, takže success. V této třídě hledá metodu Index, tu máme taky, další bod k dobru. Tato metoda nám nastaví v PropertyBagu hello na hodnotu „Pozdrav z jednokolejky“. Dále handler hledá vhodné view, které jsme také vytvořili. Předá mu Context, zpracuje se šablona a nakonec bude do prohlížeče odesláno HTML.

<html>
  <head>
    <title>Pozdrav</title>
  </head>
  <body>
    <h1>Pozdrav z jednokolejky</h1>
  </body>
</html>

Pro dnešek vše.

Související

Autor: Aleš Roubíček | Přidej komentář | Delicious | Digg | FriendFeed | Facebook | Linkuj! | Jagg

Komentáře RSS

  1.  

    Jozef Izso

    23.06 - 17. srpna 2007 | #

    Aké RAD výhody má MVC model v podaní MonoRails?

    MVC2 používame na „obrovskom“ JSP projekte a tak som nikde nevidel výhody tohto modelu. V prípade Controlleru a View sa jedná o samostatné súbory, nijako programovo neprepojené. Jediný spôsobom, ako sa medzi nimi prenášajú údaje sú rôzne polia a hash tabulky. Na všetky problémy teda prichádzame až počas behu.

    Poskytuje MonoRails programové prepojenie podobné WebForms? V podstate Controller naviazaný na daný View? A teda by mal prístup k inštancii View?

  2.  

    Aleš Roubíček

    07.19 - 18. srpna 2007 | #

    RAD možnosti přináší MonoRail ve spojení s ActiveRecord, vygeneruje se model z databaze, pomoci designeru (ActiveWriter) si ho upravíte k obrazu svému, můžete využít Scaffolding pro CRUD operace.

    Díky MVC můžete mít celou výkonnou logiku pod testama, takže většinu chyb byste měli hned vidět, pokud na ně máte Fixture. MonoRail přináší i další Asserty k testování správného výstupu z Controlleru na View. Ale to už je spíše Agile než RAD…

    Ad poslední otázka. To samozřejmě nemá. Ale pokud něco takového potřebujete, v rámci Castle Projektu existuje MVP framework postavený nad WebForms Igloo nebo jeho fork Rhino.Igloo.

  3.  

    Jozef Izso

    11.02 - 18. srpna 2007 | #

    Práve tam vidím ten problém, že síce backend vrstvy sú testované (debug, unit testing, statická kontrola kódu), ale v MVC je strašne ťažké udržať poriadok medzi View a Controllerom.

    Na našom projekte je vyše 300 akcií rozdelených do asi 8 kontrolérov (z toho 2 majú 150 a 50 akcií, prípadne niečo čo je ekvivalent akcie, pretože tam bol vyvinutý kvázi framework na „jednoduchšie“ spravovanie). Určite by každý skúsenejší programátor v MVC povedal, že to je priveľa na tento model. Ale keď sa s ním raz začalo, pokračovalo sa v ňom…

    A tu je strašný problém udržať konzistenciu medzi Controllerom a View. Keď 10 ľudí má robiť a upravovať model, ktorý sa nedá skontrolovať počas kompilácie, statickou validáciou kódu, všetky problémy sa riešia až za behu.

  4.  

    Aleš Roubíček

    08.02 - 19. srpna 2007 | #

    MonoRail dokáže testovat i propojení Controlleru s View. Viz. Testování MonoRail

Místo pro tvůj názor

Povinné je jméno a komentář, z e-mailu se rozpoznají Gravatary.
Komentář je formátován pomocí Texy! syntaxu.
Například: **tučný text**, *kurzíva*, "text odkazu":adresa.
Internetové adresy jsou převáděny na odkazy.
Na komentáře se můžete odkazovat pomocí [číslo komentáře].

Nový komentář