Daniel Kolman

Spike aneb ověření, jestli to vůbec půjde

| 2 comments |

Po instalaci Linuxu jsem potřeboval vyzkoušet, zda fungují klíčové technologie, na které se bude můj projekt spoléhat. Při té příležitosti si také trochu ošahám MonoDevelop (a zjistím jestli je vůbec použitelné). V programátorštině se tomu řiká spike, neboli malý prográmek, který jako tenký hřebík projde všechny vrstvy aplikace a ověří, že navržené řešení není totální pitomost. Po dokončení se takový projekt nemilosrdně smaže, protože při jeho tvorbě nejsou uplatňovány principy trvale udržitelného programování.

Můj blog poběží na ASP.NET MVC a data chci ukládat do databáze. Mám totiž zaplacený hosting a nechce se mi ho měnit, navíc C# je jediný jazyk, který pořádně ovládám:-) Jako datovou vrstu chci použít Castle ActiveRecord, což je vlastně sugar-added vrstva nad NHibernate. Pro testování bych chtěl použít buď XUnit nebo NUnit.

Vytvořil jsem proto v MonoDevelop solution, do které jsem přidal tři projekty. Jeden bude obsahovat doménové objekty odvozené z ActiveRecordBase<T>, druhý NUnit testy pro ověření základních operací s databází, a třetí bude MVC projekt. V prvním projektu jsem založil dvě jednoduché třídy, Post a Comment. Díky ActiveRecord stačí jejich property okrášlit patřičnými atributy a ORM vrstva je hotová:



Pro ukládání dat budu potřebovat nějakou funkční databázi. Na mém hostingu mám zaplacenou MS SQL databázi, která se na Linuxu nedá použít. Budu proto používat MySQL. NHibernate by měl zajistit, že můj blog bude fungovat na obojím. Protože tomu nevěřím úplně na 100%, budu potřebovat sadu testů, které lze spustit jak na Linuxu, tak na Windows. Po dokončení nové featury na Linuxu spustím sadu testů na Windows a teprv poté publikuju novou verzi na svůj "produkční server".

Nainstaloval jsem proto MySQL, což je na Linuxu otázkou vteřin (záleží na rychlosti připojení) a nakonfiguroval z konzole podle návodu. Vytvořil jsem si pomocnou třídu, která inicializuje ActiveRecord podle konfiguračního souboru a nainstaluje prázdnou databázi:



V testovacím projektu jsem vytvořil jednoduchý test, který v [SetUp] metodě zavolá obě výše uvedené metody. Není to ideální ale pro účely spike to bohatě stačí. Dále jsem přidal app.config pro nastavení NHibernate:



Nevím jestli je to v MonoDevelop bug nebo featura, ale po přidání app.config do projektu není automaticky zajištěno, že se správně nakopíruje do výsledné složky. I když jsem vytvořil nový soubor pomocí šablony "Application Configuration File", bylo nutné ručně nastavit "Build action" na "Application definition" a "Copy to output directory" na "Copy if newer". OK, s tím jsem schopný žít.

Aby se NHibernate byl schopen připojit k MySQL, je potřeba stáhnout MySQL Connector, což je vlastně ADO.NET driver pro MySQL databázi. Zde se objevilo první problematické místo: Když se NHibernate pokoušel načíst assembly MySql.Data, došlo k výjimce. Mono nemohlo assembly najít, i když soubor existoval. Vzpomněl jsem si že názvy souborů v Linuxu jsou case-sensitive a stažený soubor se jmenuje mysql.data.dll, jenže správný název assembly je MySql.Data. Mono proto hledá MySql.Data.dll, které nenajde. Naštěstí stačilo tuto knihovnu přejmenovat a problém byl odstraněn.

Pak už vše jelo jak po másle: Vytvořil jsem několik testů, které vytvářejí Post, přidávají k němu Comment, listují Posty atd. Všechno co jsem zkoušel fungovalo tak jak má. Horší je to ale s vývojovým prostředím. Když jste zvyklí na Visual Studio s ReSharperem, budete v MonoDevelop postrádat online kontrolu chyb, formátování kódu (funguje částečně), přidávání using namespace a referencí pomocí klávesových zkratek, a doplňování vám bude připadat hloupé. Například když píšete attribut, nenabídne vám property která je definovaná v base třídě, takže např. u [HasMany] se nenabízí Lazy=true, protože tato property je definována ve třídě RelationAttribute, která je předkem HasManyAttribute. Nejvíc mně ale vadí spouštění unit testů. Aby jste mohli spustit jeden konkrétní unit test v debugu, musíte nejdřív spustit všechny testy, pak ho nalézt v okně Unit Tests a v kontextovém menu zvolit Run Test With - Mono Soft Debugger. Zatím jsem nepřišel na žádnou klávesovou zkratku, která by test spustila přímo.

Ještě zbývá zkusit napojení ASP.NET MVC na doménovou vrstvu a pak se už můžeme pustit do vývoje skutečné aplikace.

(2) Comments

  1. Aleš Roubíček said...

    Tuším, že ActiveRecord má v sobě přímo nějakou třídu, která slouží jako base pro unit testy. Dokonce by měla běhat proti sql-lite bez potřeby mít nainstalovanej nějakej sql server.

    Osobně se ActiveRecordBase vyhýbám a používám statický ActiveRecordMediator jako základ DAO objektů. :)

    Jo a pokud máš trunk verzi AR tak nemusej bejt property virtual max ty lazy.

    6. ledna 2010 21:09
  2. Ali Baba said...

    Díky za připomínky, určitě na to mrknu. ActiveRecord používám poprvé, takže ocením každou radu.

    6. ledna 2010 22:51

Leave a Response