Geekiod'dan bahsettiğim gibi XSD kullanıyorum. İşte benim T4 kurulumum:
Benim T4 çözümümde MyObject.xml dosyası var. Bu, Microsoft SDK tarafından sağlanan XSD programını çalıştıran
cd C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin
xsd "C:\Users\XXXX\Documents\Visual Studio 2012\Projects\XXXXX.Templates\XXXXX.Templates.CodeGenerator\MyObject.xml"
xsd "C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\MyObject.xsd" /c
xcopy /s "C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\MyObject.cs" "C:\Users\XXXXX\Documents\Visual Studio 2012\Projects\XXXXX.Templates\XXXXXX.Templates.Common"
: (i MyObject.xml şema değişiklik yaptığınızda veya güncelleme)
bu bat komut dosyasını çalıştırmak MyObject.xml gelen MyObject.cs oluşturmak için .xml dosyanızda. XSD bir .xsd dosyası oluşturur. XSD'yi yeni .xsd dosyasında tekrar çalıştırın ve .cs dosyanızı oluşturacaksınız. Hepsi aynı ada sahip. Komut dosyası daha sonra .cs dosyasını SDK klasöründen tekrar projeme kopyalar.
Artık xml belgenizi temel alan .cs güçlü yazdığınız bir dosya var. Artık bu gibi .tt dosyalarında güzel şeyler yapabiliriz:
<#@ parameter name="XmlFileName" type="System.String" #>
<#
XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
StreamReader sr = new StreamReader(this.XmlFileName);
MyObject O = (MyObject)serializer.Deserialize(sr);
#>
using System;
public class <#= O.Name #> : BusinessObjectBase<<#= O.Name #>Data>
{
#region Construction
private <#= O.Name #>() : base(true) {}
/// <summary>
/// Initializes a new instance of the <#= Utility.GetRefClassName(O.Name) #> class.
/// </summary>
/// <param name="data"></param>
<#= Utility.GetRemarksComment2(O) #>
internal <#= O.Name #>(<#= O.Name #>Data data) : base(data) {}
#endregion
#region <#= O.Name #> Data
<#
// Generate a property for each child.
foreach (MyObjectProperty objProp in O.Property)
{
if (objProp.GetAccess == "public")
{
objProp.GetAccess = "";
}
else
{
objProp.GetAccess = objProp.GetAccess + " ";
}
if (objProp.SetAccess == "public")
{
objProp.SetAccess = "";
}
else
{
objProp.SetAccess = objProp.SetAccess + " ";
}
#>/// <summary>
...
ben "XmlFileName" değişken bağlı olan .tt dosyaları kapalı kod oluşturmak için benim T4 çözümünü çalıştırmak için TextTemplatingSession sınıfına.
static void RunThroughSession()
{
string objectName = "MyObject";
var template = Activator.CreateInstance<BusinessObjectTemplate>();
TextTemplatingSession session = new TextTemplatingSession();
session["XmlFileName"] =
@"C:\Users\XXXXX\Documents\Visual Studio 2012\Projects\XXXXXX.Templates\XXXXXX.Templates.CodeGenerator\" + objectName + ".xml";
template.Session = session;
template.Initialize();
string outputText = template.TransformText();
using (StreamWriter sr = new StreamWriter(
@"C:\Users\XXXXX\Documents\Visual Studio 2012\Projects\XXXXX.Templates\XXXXXX.Templates.CodeGenerator\GeneratedCode\BusinessObject" + objectName + ".cs"))
{
sr.Write(outputText);
}
bu son parçası "özel Aracı" değiştirmeniz gerekir ise: Bu da bana (MyOtherObject.xml, Customer.xml, vs) istediği kadar MyObject.xml dosyası işaret sağlar .tt dosya özelliklerinden "TextTemplatingFilePreprocessor" seçeneğine. Varsayılan, bu kurulumla çalışmayan "TextTemplatingGenerator" gibi bir şeydir.
Bu yardımcı olur umarız!