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?
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.
IMHO die zwei wichtigsten Konzepte beim Schreiben komplexer Vorlagen ist
Nicht so wichtig, aber nett
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.
Tags und Links c# unit-testing t4 code-generation refactoring