See ei ole midagi uut või avastus, T4 mallid (Text Template Transformation Toolkit) on juba pikka aega olemas ja kasutuses, aga enda jaoks avastasin ma nad mõnda aega tagasi ja plaanin neid esmajärgus just konstantide genereerimiseks kasutada. Varasemalt olen loonud enda konstantide genereerimise konsoolirakenduse, aga toon välja, miks T4 mallid (template) on palju paremad :)
Esimese asjana on vaja saada teadmist, mis asijad need T4 mallid on üldsegi. Olen leidnud super head artikklid, mida soovitan lugeda:
T4 mallide loomiseks ja kasutamiseks on vaja kahte asja:
- Jooksutajat
- Editori
Jooksutajaks (teeb koodiks, kompileerib, jooksutab ja väljastab tulemuse failina) on meil Visual Studio 2008 :) Kui te lisate oma projekti faili lõpuga “.tt”, siis panete kohe tähele, et Visual Studio proovib genereerida malli põhjal koodi. Kahjuks aga puudub Visual Studios editor mallide jaoks.
Editori –deks võivad sobida järgmised vahendid:
- Clarius T4 Editor (community ja piiratud versioon tasuta)
- Väga piiratud variant – omab koodi highlightimist ja template –i põhist intellisense. Koodi kirjutamisel intellisense –i ei ole.
- Tangible modeling tools with T4 (tasuta 1 installatsioon)
- Tasuta versiooniga on kaasas item templated, pakub intellisensi ja on värviline tekst. Kaasas on ka mingid mudelid, mis risustavad Visual Studiot, aga Editor on muidu lahe.
Oletame, et soovime SharePointi XML –i definitsiooni põhjal genereerida konstandid, et ei peaks kirjutama kuskile koodi sisse välja nime või ID –d vms. Ehk meie sisendiks on:
<?xml version="1.0" encoding="utf-8" ?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
<!-- Settings list fields -->
<!-- Name: DvkSettingId -->
<Field
ID="{23999420-C2F4-464A-89A4-583B3E143FE7}"
Name="DvkSettingId"
StaticName="DvkSettingId"
SourceID="http://schemas.microsoft.com/sharepoint/v3"
Type="Text"
DisplayName="$Resources:Dvk,FieldDvkSettingIdDisplayName;"
Group="SPDVK"
/>
<!-- Name: DvkSettingValue -->
<Field
ID="{581B2672-3425-4C2B-865F-7E6EFA50D851}"
Name="DvkSettingValue"
StaticName="DvkSettingValue"
SourceID="http://schemas.microsoft.com/sharepoint/v3"
Type="Note"
DisplayName="$Resources:Dvk,FieldDvkSettingValueDisplayName;"
Group="SPDVK"
AppendOnly="FALSE"
RichText="FALSE"
/>
<!-- Name: DvkSettingDescription -->
<Field
ID="{FB8B361E-A657-443B-BB68-565057172118}"
Name="DvkSettingDescription"
StaticName="DvkSettingDescription"
SourceID="http://schemas.microsoft.com/sharepoint/v3"
Type="Text"
DisplayName="$Resources:Dvk,FieldDvkSettingDescriptionDisplayName;"
Group="SPDVK"
/>
</Elements>
Ja me sooviksime saada järgmise väljundi.
using System;
namespace Constants
{
public static class Fields
{
public static class DvkSettingId
{
public const string Id = "{23999420-C2F4-464A-89A4-583B3E143FE7}";
public static readonly Guid IdAsGuid = new Guid("{23999420-C2F4-464A-89A4-583B3E143FE7}");
public const string Name = "DvkSettingId";
}
public static class DvkSettingValue
{
public const string Id = "{581B2672-3425-4C2B-865F-7E6EFA50D851}";
public static readonly Guid IdAsGuid = new Guid("{581B2672-3425-4C2B-865F-7E6EFA50D851}");
public const string Name = "DvkSettingValue";
}
public static class DvkSettingDescription
{
public const string Id = "{FB8B361E-A657-443B-BB68-565057172118}";
public static readonly Guid IdAsGuid = new Guid("{FB8B361E-A657-443B-BB68-565057172118}");
public const string Name = "DvkSettingDescription";
}
}
}
T4 templated teevad asja meie jaoks väga lihtsaks. On vaja kirjutada üks ASP –lik koodi ning teksti segu ja genereerubki automaatselt valmis väljund :) Selle segu kirjutamine on väga lihtne, igatahes lihtsam kui minu konsooli generaatorite kirjutamine.
Meil on vaja XML –i definitsioon sisse lugeda, kõik “Field” elemendid läbi käija ja attribuutidelt väärtused võtta.
<#@ output extension=".cs" #>
<#@ Assembly Name="System.dll" #>
<#@ Assembly Name="System.Xml.dll" #>
<#@ Assembly Name="System.Xml.Linq.dll" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Xml.Linq" #>
using System;
namespace Constants
{
public static class Fields
{
<#
XElement xml =
XElement.Load(@"C:\Projects\Temp\T4\CodeGeneration\Fields.xml");
XName fieldElementName =
XName.Get("Field", "http://schemas.microsoft.com/sharepoint/");
foreach (XElement field in xml.Elements(fieldElementName))
{
string name = field.Attribute("Name").Value;
string id = field.Attribute("ID").Value;
#>
public static class <#= name #>
{
public const string Id ="<#= id #>";
public static readonly Guid IdAsGuid = new Guid("<#= id #>");
public const string Name = "<#= name #>";
}
<#
}
#>
}
}
Esimese asjana määrame ära, et väljundiks on “.cs” lõpuga fail ehk siis C# –i koodifail.
Järgmine on juba genereerimise osa – assemblyd, nimeruumid, mida kasutame koodis ja text-kood, mis töö ära teeb. Kood on <# #> märkide vahel, muu on tekst.
Konstantide genereerimist saab kindlasti optimeerida nii, et kasutatakse mingit üldist meetodit, mis standard genereerimie ära teeb, saades sisse vajalikud parameetrid. Näiteks antud juhul võiks olla meetod, mis saab sisse XML –i pathi, välja nimetuse ja attribuutide loetelu ning selle põhjal siis genereerib konstandid (kui GUID välja jätta või nutikalt lahendada).
Konstandid SharePointi puhul aitavad teil ära kasutada olemasolevaid XML definitsioone, mida te niikuinii kirjutate installeerimise ja paketeerimise jaoks. Väldite igasuguse teksti ja id –de jne sissekirjutamise ning nende uuendamise/muutmise mured. On ainult üks koht kus saab nässu keerata väärtuse.
T4 templated on lihtsad, Visual Studiosse integreeritud ja päris võimsad.
Edu!