2010. július 11., vasárnap

Validációs konstansok generálása T4 segítségével

Úgy gondolom, hogy sokan lehetnek azok, akik utálják, ha valamit kétszer kell beírni. Az egyik kollégám és én biztosan így vagyunk…Főleg, ha szigorúan típusos környezetben vagyunk.

Az egyik ilyen eset amikor validációs attribútumokkal dolgozom. Sok tévedésre ad lehetőséget, ha tagok dekorálása során valamelyik stringet elírjuk.

A probléma

Például az alábbi CustomValidation attribútumnál is meg kell adnunk a validálást végző metódust.

[CustomValidation(typeof(DataValidation), "IsAgeValid")]
public int Age { get; set; }

A probléma nem az, hogy ez a megoldás kényelmetlen, hanem az, hogy ha véletlenül elírjuk a metódus nevét (Pl.: “IsAgevalid”), akkor a projekt gyönyörűen le fog fordulni. A hibát majd akkor fogjuk kapni, amikor ez a validáció lefut. Nyilván ez egy kisebb projektnél nem probléma, de amikor sok 100 meta-adat attribútumról beszélünk, akkor azért nem egyértelmű, hogy minden hibát könnyedén kiszúrunk.

A megoldás(om)

A probléma megoldására kódgenerálást választottam. Azaz előállítok minden validációs metódusra egy string konstanst. Ehhez a Visual Studióba (2008, 2010 nem Express változatok) beépített T4 (Text Template Transformation Toolkit) generátort.

Cél: Legyen egy olyan osztály, amelyben konstansként szerepelnek a validációs metódusok.

public static partial class DataValidation
{
    public const string IsAgeValidMethod = "IsAgeValid";
}

Ezek megléte esetén már így tudunk hivatkozni a metódusokra:

[CustomValidation(typeof(DataValidation), 
DataValidation.IsAgeValidMethod)]
public int Age { get; set; }

 

Így készült

A T4 scriptek egyszerű szöveges fájlok. Így szerkeszthetők bármelyen szövegszerkesztővel, de javaslom a “Tangible T4 Editor” letöltését a Visual Studióhoz. Könnyen elérhető a Tools menüben található Extension Manager használatával.

image

A telepítés után új sablonokat találunk az Add New Item ablakban:

image  A “Simple T4 template” tökéletes az induláshoz: benne lesznek az alapvető import direktívák, a kimenet .cs és egy kis segítség a folytatáshoz.

image

Na én ebből a Windows.Foms-t kidobtam és beraktam inkább a EnvDTE assambly hivatkozást és importot. Az EnvDTE egy olyan library, amivel a Visual Studio automatizációját lehet elérni.

image

A script felépítése igen egyszerű. A bevezetőszöveg után egy namespace, majd minden egyes feldolgozott validációs osztályt tartalmazó fájlhoz generál a ProcessProjectFile hívás egy osztályt.

image Először a script meghívja az Init függvényt, amelyben inicializáljuk a hozzáférést a projekthez:

image

Ezek után a hívódik meg a ProcessProjectFile, amely feldolgozza a megadott fájlt. A feldogozás során a DTE projektmodellen lépkedünk végig rekurzívan. A modell így épül fel: ProjectItem > FileCodeModel > CodeElements.

Végigmegyünk ezeken a CodeElement-eken és azok vizsgálatával generáljuk ki a nekünk szükséges kódot. A CodeElement-ek is tartalmaznak további gyermek CodeElement-eket, ezért rekurzívan végig kell ezeken menni. Az érdemi munkát ez a rész csinálja:

image

A kódgenerálóban nem sokat törődtem a hibakezeléssel. Sokkal komolyabban is meg lehet valósítani ezt a scriptet, most inkább csak a kedvcsinálás volt a cél.

Példa forráskód a CodePlex-en: http://martonrusko.codeplex.com/

Referenciák:

Oleg Sych MVP blogja – rengeteg cikk a T4-ről
Tangible T4 Editor – a T4 editor Visual Studióhoz

Nincsenek megjegyzések:

Megjegyzés küldése