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

Redakční systém na ASP.NET MVC

18.56 - 23. prosince 2007 | Webdesign

Rozhodl jsem se, že, jako praktickou ukázku použití TDD a ASP.NET MVC (dále jen MVC), budu psát seriálek, výsledkem něhož bude základ třetí verze redakčního systému Gryphoon.

Upozornění: Je možné, že některým věcem nebudete v průběhu čtení rozumět. Dopuručuji si přečíst související články, na jejichž základě tento seriál staví.

Už z této podstaty vyplívá, že půjde o OSS. Projekt je hostován na Codeplexu pod MS-PL. Dalším důležitým znakem je použití Texy.net jako základního kamene systému, spojení s databází bude zajišťovat Castle ActiveRecord, pro testování použiji xUnit.net a Rhino Mocks. Tím jsou nastíněny základní prvky architektury a můžeme se pomalu dát do práce.

Struktura projektu

Prozatím to vypadá na tři projekty v řešení:

  1. Rarous.Gryphoon – Knihovna, jádro systému, které bude obsahovat objekty doménového modelu, konfiguraci a další potřebné komponenty.
  2. Rarous.Grypho­on.Spec – Knihovna s jednotkovými testy. xUnit.net místo termínu test používá fakt, proto bude brát tento projekt jako specifikaci zbylých částí.
  3. Rarous.Grypho­on.Web – Webová aplikace. Projekt bude obsahovat webovou část tj. Controllery a View (řadiče a pohledy) a Helpery (pomocníky).

První řádky specifikace

Naší jedinou specifikací bude projekt Rarous.Grypho­on.Spec. Tím co je v něm dáno, by se měly řídit oba zbylé projekty. Dobrým zvykem v TDD je navrhovat systém od shora dolů. První věc, se kterou přijdete do styku, je URL. Zatím nebudu výchozí schéma URL měnit, proto ani nebudu psát testy na Routování (zatím). Defaultní schéma URL by mělo být už milionkrát otestované v rámci MVC projektu.

Takže budeme pokračovat dál a to k řadiči článku (ArticleController). Ten by měl být zodpovědný za vytváření článků nových, jejich následnou editaci, zobrazování a v poslední řadě i mazání.

V prvním CTP, zatím nejsou předdefinované Mock Objekty pro controllery, proto použijeme Test subclass pattern, pro ověření činnosti controlleru. Controller bude mít následující rozhranní:

Diagram IArticleController

A třída pro testování vypadá následovně:

public class TestArticleController : ArticleController {
  public string ActualViewName { get; set; }
  public string RedirectViewName { get; set; }
  public string ActualMasterName { get; set; }
  public object ActualViewData { get; set; }

  protected override void RenderView(string viewName, string masterName,
                                     object viewData) {
    ActualViewName = viewName;
    ActualMasterName = masterName;
    ActualViewData = viewData;
  }

  protected override void RedirectToAction(object values) {
    RedirectViewName = values.ToDictionary()["Action"];
  }
}

Teď můžeme napsat první test, který ověří, že pokud přijdeme na adresu /article/ otevře se nám editor nového článku. Pozn. Využívám výchozího schématu routeru [controller]/[action]/[id] -Pokud není action definovaná vybere se Index. V budoucnu ho změním na lepší, ale pro začátek stačí.

[Fact]
public void ArticleController_DefaultActionShouldShowEditor() {
  TestArticleController controller = new TestArticleController();

  controller.Index();

  Assert.Equal("Editor", controller.ActualViewName);
}

Spustíme test – neprojde. Aby test prošel, musíme doimplementovat metodu ArticleController.Index.

[ControllerAction]
public void Index() {
  RenderView("Editor");
}

Teď už by měl test projít. Jenže aby to fungovalo i na webu, musíme ještě dopsat View /Views/Article/Editor.aspx… Do příště za domácí úkol.

Závěrem

Aktuální stav je na codeplexu ke stažení, ale zdaleka není funkční. :) Průběžně ho budu s dalšími díly doplňovat. Příště tedy uděláme ukládání nových příspěvků a editaci. Když se pozorně podíváte na zdrojáky, zjistíte, že tak trochu cheatuju :)

Jo abych nezapoměl, pokud jste sem přišli přes RSS a ještě jste si nezměnili adresu feedu, učiňte tak zavčasu. Děkuji

Související

Tagy: ,

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

Komentáře RSS

  1.  

    Borek

    21.52 - 23. prosince 2007 | #

    Tenhle seriál je hodně chvályhodný počin! V Čechách jsem nic podobného neviděl, tak ti držím palce a těším se na další díly.

    Borek

  2.  

    Aleš Roubíček

    01.07 - 24. prosince 2007 | #

    Jen aby to nedopadlo jako s těma předchozíma seriálama :D

  3.  

    Tomik

    09.11 - 24. prosince 2007 | #

    Vypadá to hodně zajímavě, držím palce!

  4.  

    Petr

    14.36 - 24. prosince 2007 | #

    Chválím a rád si cokoliv o ASP.NET MVC přečtu. Nicméně jsi mohl do prvního příspěvku zařadit nějaké cíle, protože „CMS“ je široký pojem.

    Bude jednoduše skinovatelný/lo­kalizovatelný/roz­šiřitelný?

    Bude se jednat o klasický blogovací systém, nebo bude umět „něco víc“?

  5.  

    Aleš Roubíček

    21.42 - 24. prosince 2007 | #

    [4] Petr Měl by být dost na míru mým potřebám. Tento blog běží na Gryphoonu 1, ze zkušeností za ta léta posbíraných znám jeho slabiny a vím, kam ho posunout.

    • Jednoduše skinovatelný – ano, v MVC je to velice snadné :)
    • Lokalizovatelný – možná, ale není to pro mne priorita.
    • Rozšiřitelný – doufám, že jo. K tomu by mělo vést TDD a plánuju použít IoC contejner…

    Nebude to úplně klasický blogovací systém, mělo by v něm být stejně snadné blogovat a spravovat webovou prezentaci. V současné době tu mám dost statických stránek, které bych chtěl mít v CMS. Aktuálně používám rubriky pro třízení článků v blogu, nově je plánuju použít pro strukturu webu a blog třídit pomocí štítků. Plánuji i podporu Web Forms modelu. Myslím, že silnou/slabou (pro někoho) stránkou je spjatost s Texy, deklarativní konfigurace a dlaší fičůry :)

    Nemám v úmyslu dělat nějakej nejlepší projekt, ale takovej kompaktní framework pro snadnou a rychlou tvorbu webu, kterej má sedět mým potřebám a ušetřit práci. Nic víc, nic míň.

  6.  

    optik

    17.37 - 28. prosince 2007 | #

    Uvidíme, jak to půjde rychle s ASP.NET, jsem zvědav, na Zend Frameworku – MVC pro php – jsem si napsal blogovací engine i s administrací úplně od 0 asi tak za měsíc – viz muj blog (jsou tam i zdrojaky) (pardon za trochu ego kecy ala R. Hulan), v Ruby/Pythonu by to slo asi stejne rychle.

    MVC s podporou od MS muze byt jednim z duvodu pro spoustu vyvojaru se seriozne zabyvat vyvojem web aplikaci v C# a .NET.

    Na tomto .NET MVC mi zatim vadi pouzivani C# ve view sablonach, chtelo by to nejaky dynamictejsi skriptovaci jazyk, v PHP to je pohoda, funguje samo o sobe jako sablonovaci system, mozna Boo, nebo PowerShell.

  7.  

    Aleš Roubíček

    20.07 - 28. prosince 2007 | #

    seriozne zabyvat vyvojem web aplikaci v C# a .NET.

    :D aha do teď to nemělo cenu. Několik let jsem zabil. Konečně přichází vysvobození…

    View engine můžeš používat dle libosti, který chceš, třeba Brail, nebo psát v IronPythonu. No problem on dotnet.

    Ten PowerShell beru jako dobrej vtip. dlouho jsem se tak nezasmál. Díky

  8.  

    optik

    23.18 - 28. prosince 2007 | #

    S tim seriozne je to dost mimo, to jo, asi takhle, MVC se supportem primo od MS si casem dokazu predstavit jako duvod k migraci napr. od nejakeho OSS MVC Java Frameworku.

    Ten PowerShell jsem jen tak strelil, nic o nem nevim, nicmene pokud ma cykly, podminky, reg. vyrazy, slusnou podporu prace s textem a umi pracovat s objekty z C#/.NET (to pry ano), tak by mohl jit v klidku ve view pouzit, nic vic view sablone asi potreba neni.

  9.  

    Aleš Roubíček

    08.35 - 29. prosince 2007 | #

    [8] optik Zatím je ASP.NET MVC v batolecím stavu a ještě se hledá, k tomu aby to byl framework k napsání enterprise aplikace mu ještě hodně chybí. Naštěstí tu je MonoRail, který už dorůstá z puberty.

    No Hammett (lídr vývoje Castle Projectu) uvolnil MVC Extensions, které některé věci z MonoRailu přenášejí na ASP.NET MVC (view engine NVelocity, Windsow a ActiveRecord integraci).

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ář