Gibt es da draußen etwas, das den T4-Code mehr ... sauber macht?

8

Ich habe eine ziemlich komplexe Sache in eine T4-Vorlage gestopft. Grundsätzlich nehme ich etwas wie

  

{= foo =} mehr Text ...

und wandeln Sie es in eine Klasse (Ansicht) wie folgt um:

%Vor%

Der generierte Code ist natürlich viel komplizierter. Wie dem auch sei, die T4-Vorlage ist jetzt über 600 Zeilen Code und wird schnell unhandlich. Ich glaube, das Hauptproblem besteht darin, Code und "Inhalt" (dh statischen Code) zu mischen. Ich bin mir nicht wirklich sicher, wie ich dieses Problem sauber beheben kann (und natürlich nicht den generierten Code beeinflusst). Ich sehe auch keinen praktikablen Weg, um meinen T4-Code zu testen, außer ihn einfach auf T4-Ausführungsfehler zu testen. Und natürlich scheint es die fast unmögliche Aufgabe zu sein, den generierten Code zu testen.

Gibt es Frameworks oder Techniken, die ich verwenden kann, um meinen T4-Vorlagencode sauberer zu machen?

    
Earlz 29.10.2012, 05:04
quelle

2 Antworten

1

Nach einer langen Reise habe ich endlich die ersten Unit-Tests in meine T4-Templates eingecheckt. Grundsätzlich habe ich eine "Ansicht" (die eigentliche T4-Vorlage) und die "Logik" (was den Code erzeugt, aber nicht wirklich ausgibt und nicht auf T4 basiert) abstrahiert.

Ich ging dann einen Schritt weiter und benutzte einen großen hack um es so zu machen, dass meine Logikdatei außerhalb von T4 kompiliert wird. Dies hatte den schönen Effekt, es so zu machen, dass Intellisense- und Compilerfehler funktionierten. Es erlaubt mir auch den Zugriff auf meine Logikklasse durch Komponententests, indem einfach auf das Projekt verwiesen wird.

Ich schrieb einen Artikel mit Code-Beispielen (vorher / nachher) und Beispiel-Unit-Tests auf meinem Blog , wenn Sie wollen die langwierigen Details, wie es geht.

    
Earlz 21.11.2012, 03:53
quelle
5

IMHO die zwei wichtigsten Konzepte beim Schreiben komplexer Vorlagen ist

  1. Trennen des Modells und der Ansicht - Dies hilft, die Vorlagenlogik auf ein Minimum zu beschränken (oft ein Grund für Wartungsprobleme). Persönlich denke ich, dass dies keinen Rahmen erfordert, es erfordert nur, dass Sie es tun.
  2. Partiell ist dein Freund - Ich benutze T4 im Allgemeinen, um den Code aus dem Modell zu generieren. Spezifisches Verhalten ist möglicherweise nicht die Mühe wert, in das Modell eingefügt zu werden, besser, um dieses Verhalten durch die Verwendung partieller Klassen oder Methoden zu ermöglichen.

Nicht so wichtig, aber nett

  1. Machen Sie den Code durchsuchbar - Ich verlasse mich nicht auf T4 Addons, weil ich keine von ihnen gut genug finde, mit dem Mangel an IntelliSense, um durch den Code zu navigieren, um den Code durchsuchbar zu machen. Es kann so einfach sein, anstatt den Namen einer Column-Eigenschaft aufzurufen, ich nenne es ColumnName.
  2. Einfügen von "Tags" in die Ausgabe - Erleichtert das Auffinden des Codes, der diesen Teil der Ausgabe generiert hat.

Beispiel für die Trennung von Modell / Ansicht:

%Vor%

Die Ansicht iteriert dann über das Modell und generiert die Abhängigkeitseigenschaften.

Das Verhalten der Abhängigkeitseigenschaften wird dann als partielle Methode implementiert

%Vor%

Beachten Sie, dass das Einfügen dieses spezifischen Verhaltens in das Modell das Modell erheblich komplizierter machen würde.

Schließlich; Es braucht Zeit, bis ein kompetenter Programmierer Metaprogramme kompetent schreiben kann. Ich habe mehrere Versuche gebraucht, bis ich zu einem Stil kam, der meiner Meinung nach haltbar ist, aber für mich war es die Mühe wert, da ich in der Lage bin, Qualität schneller zu liefern.

Ich hoffe, das hilft ...

PS. Ich denke nicht, dass irgendjemand argumentieren würde, dass T4 immer elegant ist, aber es ist trotzdem verdammt nützlich.

    
FuleSnabel 29.10.2012 19:52
quelle