Komponenten, Engine, kontrolliert den text template transformation - Prozess, kann nicht an eigene Bedürfnisse angepasst werden, Host, Schnittstelle zwischen Engine und Benutzerumgebung (Visual Studio), Verantwortlich für, lokalisieren von Dateien und Assemblies, Generierten Text in Datei schreiben, Default-Erweiterung setzen (*.cs), Empfangen der Fehler von der Engine, Anzeigen, Logfile schreiben, kann angepasst werden, ITextTemplatingEngineHost, Directive Processors, Bereitstellen von zusätzlicher Funktionalität und Instruktionen für die Engine, Bsp., Lesen aus einer Datenbank, Verarbeiten von Metadaten, Öffnen und lesen von Dateien, DSL - Diagramme, XML Dateien, Alles was ein Interface hat, um ausgelesen zu werden, SPARX, SAP, Typen, Built-in, Basis, built-in Direktiven, assembly, import, template, output, include, parameter, Generated, im Bereich der DSL-Werkzeuge, Aktivitätsdiagramme, Klassendiagramme, Use Case Diagramme, Custom, Klasse DirectiveProcessor, Bsp. VolatileAssembly (T4Toolbox)
Custom Tool, TextTemplate, TextTemplatingFileGenerator, PreProcessedTemplate, TextTemplatingFilePreprocessor
Verbesserungen mit VS 2010 SP1, assembly Direktive sperrt nicht mehr die DLL bis Solution geschlossen wird, bisher VolatileAssembly aus der T4-Toolbox, Fallback mit Registry-Key, HKEY_LOCAL_MACHINE\SOFTWARE\[Wow6432Node]\Microsoft\VisualStudio\10.0\TextTemplating, ShadowCopy=false, Verbesserte Inheritance-Strategien
Gefahren, Beliebiger Code innerhalb der Statementblocks möglich, Auf Schadcode anfälliger Directive Processor, Warnung auf eigene Gefahr
Quelle Oleg Sych, mit Speichern des Templates, Kompilierung, Ausführung, in 2 Schritten, 1. Schritt, Engine verarbeitet das Template, parsen von, Verarbeitungsinformationen, Text und Codeblöcke, generieren einer TextTransformation-Klasse, kompilieren in eine .Net Assembly, 2. Schritt, Engine erzeugt eine Instanz von GeneratedTextTransformation, Aufruf der Methode TransformText, Rückgabe des Strings in die Ausgabedatei
Code Generator innerhalb der Solution, keine zusätzliche Software/Lizenz, besserer Überblick, was wurde automatisiert, mit Visual Studio Host, Transparenz, Vereinfachte Optimierung von Code, Bsp. SQL, Refactoring, Erweiterungen für bestimmte Funktionalität, Except, nahtloses Zusammenspiel mit Entwicklungsumgebung, FileCodeModel, Textbasiert, Teil von Visual Studio, kombiniert mit T4 sehr mächtig, Automation Model, Sync mit Projektmappe
DSL/UML Konsistenz, ermöglicht die Übereinstimmung von Modell und Code, Entwurf, Implementierung, Dokumentation, Einfacher lesbar, Erstellen eigener DSL
Geringer Lernaufwand, Syntax angelehnt an klassischen ASP, PHP, kann C# oder VB innerhalb der Blöcke benutzen
Anpassbarkeit, Erweiterbarkeit, Einsatz für eigene Generatoren möglich, Verwendung in eigenen Anwendungen, Preprocessed Templates, keine Abhängigkeit zu VS 2010
Nicht an Wizards gebunden, Code entspricht nicht immer den Bedürfnissen, es wird mehr generiert als benötigt wird, Offen für neue Sprachen bzw. Diagramme, Wizard ist meist T4
Technologieunabhängig, beliebiger Text-Output, cs, vb, xml, sql, dtsx, resx, xaml, .java, uvm.
Codequalität kann verbessert werden, korrigierte Fehler im Template gehen nicht vergessen, keine Flüchtigkeits- oder Rechtschreibfehler, Gleichbleibende Qualität, Codeerstellung ist reproduzierbar
Produktivität kann gesteigert werden, Automatisierung stupider Aufgaben, Prozeduren für EF, Mockobjekte, Factories, Repositories, Schnittstellen, Unittests, Fehleranfälligkeit sinkt, Nachträglicher Änderungen sind einfacher möglich, T4 ist in den Entwicklungsprozess eingebunden, Prozessautomatisierung mit VS Automation Model, Bsp. Ein-/Auschecken Code, Linken von Dateien, VS File Code Model, Nachbearbeitung von Code
Kosten können bedingt gesenkt werden, Paretoprinzip beachten, Codegenerierung kann nicht vollständig ermöglicht werden, Mehr Zeit für Dinge die als erstes aus Kostengründen in einem Projekt wegrationalisiert werden
Blick auf die Kundenanforderungen
Zusammengefasst, Zusammenspiel mit Entwicklungswergzeug VS, Verwendung von DSL, Anpassen der Templates, Dinge die von einen guten Code Generator erwartet werden erfüllt T4
kein Intellisense, nur mit Zusatztools, tangible T4 Editor
keine volle Shortcut-Unterstützung, Bsp. CTRL K,C
keine Code Snippets, ebenfalls nur mit Zusatzstools, Snippet Support innerhalb der Statement Blocks, C# Snippets jedoch ohne Intellisense, Eigene Snippets nur, wenn im VS-Basisverzeichnis abgelegt, C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC#\Snippets\1033\Visual C#\, C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC#\Snippets\1031\Visual C#
Refactoring-Tools wie CodeRush funktionieren nicht innerhalb der Statement and Class Feature Blocks, wird sich auch in naher Zukunft nicht ändern, Alternative Vote for S134920
gewohnte Komfort von VS kann zur Zeit auch nicht mit Zusatztools erreicht werden
kein Framework, T4 Toolbox, Keine Synchronisierung von Code und Model (leistungsschwache Versionen von VS), Eigenimplementierung erforderlich, Bei gleichzeitiger Änderung von Code und Model ist ein Zusammenspiel erforderlich mit, Stringbuilder-Variable GenerationEnvironment (T4), FileCodeModel, Es gibt Tools auf den Markt die in dieser Hinsicht leistungsfähiger sind, aber auch hier, es gibt nicht die Silberkugel, HowTo's und Blogs, Nicht immer die optimalsten Lösungsansätze
MSDN Doku ist etwas dürftig, keine Informationen zu Preprocessed Templates (Vorverarbeitete Textvorlage), mittlerweile besser, Gemeinsamkeit mit anderen Code Generatoren
Sicherheitslücken möglich
Unterlagen müssen in einer normalisierten Form vorliegen, Problem bei, unstrukturierten Unterlagen, proprioritären Formaten, Anforderungsdokumente liegen nicht immer so vor, dass diese für die Automatisierung genutzt werden können
Gefahren, Eierlegende Wollmilchsau, Spaghetti Code, Anpassen bestehender Templates, kann zu Mehraufwand führen, Fehlende Design-Überlegungen, Hintergrund, klassisches Antipattern, wenig strukturiert, keine Wiederverwendbarkeit möglich, Coderedundanz (Verletzung DRY), Aber, bei kurzer Lebensdauer kann bis zu einem gewissen Grad schlechter Code toleriert werden, Code Qualität steigt nicht weiter, Generierte Technologie wird nicht angepasst
Abhängigkeit zu Microsoft.VisualStudio.TextTemplating
built-in, include, Registry, Angabe des Dateinamens ohne Pfadangaben, HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\VisualStudio\10.0\TextTemplating\IncludeFolders\.tt, falls vom Pfad nicht gelesen werden, einmalig versuchen Visual Studio als Administrator zu öffen, bei 32bit Systemen ohne Wow6432Node, HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\10.0_Config\TextTemplating\IncludeFolders\.tt, Schlüssel temporär, VS 2010, Windows-Umgebungsvariable, %dev%\Name.tt, setx, VS Macro SolutionDir, <#@ include file="$(SolutionDir)t4inc\T4.tt" #>, Relative Pfadangaben, assembly, GAC, PublicAssembly Ordner, C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\PublicAssemblies, VS 2010, Windows-Umgebungsvariable, %dev%\Name.tt, setx, VS Macro SolutionDir, <#@ assembly name="$(SolutionDir)t4inc\T4.Core.dll" #>, Mit VS 2010 SP 1 wird die Assembly nicht mehr gesperrt, Alternative bisher, VolatileAssembly, assembly arbeitet ab SP1 ähnlich
Statement, <# #>
Expression, <#= #>, Alternativ, Write("");, WriteLine("");
Class Feature, <#+ #>, Hilfsfunktionen, Klassen, Keine Extension Methods
Processing Directive, <#@ #>
Textblock
Error("Fehler");
Warning("Warnung");
Unbehandelte Fehler erzeugen einen Abbruch
Aber keine Information möglich
TextTemplatingFileGenerator
T4 Editor 1.9.64 Pro, Ermöglicht Ausführung während Buildvorgang
CAT.NET
FxCop
StyleCop
ADC 2010, Voraussetzungen, T4Toolbox, Entity Framework CTP4, Tangible T4-Editor, VsAutomationHelper.CS.tt aus CodeGallery, Resharper kann aktuell zu abstürzen führen (Neues Public Build ab Mitte November verfügbar oder tangible kontaktieren), System.Diagnostics.Contracts, Excel 2007 oder höher, Hinweis, Mehrere Beispiele im Basic-Bereich arbeiten mit dem gleichen DemoArray, reduntante Klassennamen (Fehler beim kompilieren), erzeugte Dateien löschen, VsAutomationHelper.CS.tt liegt in einem Registry-Folder, deswegen keine Pfadangaben, Ursprungsklassen des FileCodeModelRefactoring liegen im backup-Verzeichnis des Beispiels
Webcast
Variante mit EF Filemanager
Einfache Variante
T4MultipleFilesSimple
T4MultipleFilesSimple
T4Model T4ParameterTemplate
T4Introduction
T4MultipleFilesSimple
debug="true" in Template-Direktive
Debugger.Break(), Problem, Default-Installation stürzt ab (64bit), Lösung, Ab VS2010 Debugger.Launch(), Startet auch mit debug="false" aber kein Debuggen möglich, Frage neues Fenster mit nein, schliesst auch mal die eigentliche VS Instanz, andere Versionen, bei Vista und Win 7 Registry Problem, DbgJITDebugLaunchSetting, 0×10 in 0×2 ändern, Verhalten wie XP bzw. Win 2003, Schlüssel gibt es 2mal für 64bit-Systeme in Wow6432Node
T4Model
Class Block, Ausgabelogik (Write), wenn möglich nur im Sonderfall
VS 2010, Windows-Umgebungsvariable, %dev%\Name.tt, setx, VS Macro SolutionDir, <#@ assembly name="$(SolutionDir)t4inc\T4.tt" #>
T4Model
Verwenden eigener Assemblies, Vorteil, Einsatz von Extension Methods, Verwendung bereits existierender Logik, GAC, oder PublicAssembly-Verzeichnis von Visual Studio, C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\PublicAssemblies, File, Problem, Assembly gesperrt, Lösungen, Solution schliessen und wieder öffnen, oder VolatileAssembly CustomDirektive aus T4Toolbox
Hinweis auf Don^t repeat yourself
Vererbung
partial, Double derived pattern, DSL, bei Pattern-Fanatikern bevorzugen, um ziellose Diskussionen wegen partial zu vermeiden ;-)
T4PreprocessedTemplate
T4Model
wenn API für C#
VS FileCodeModel, Roundtrip-E., Sync
Diagramm - Code Konsistenz
Erstellen der Dokumentation
Technologisch flexibel
Offen für neue Diagrammformen, eigene DSL's
Nachteil, auch einfache Dinge erfordern eine Spezifikation (Attribute), Unreife Diagramme
Preprocessed Templates
Stupiden Code automatisieren
Mehraufwand reduzieren, Store Proecedures
Refactoring vereinfachen
T4 Template versioniert mit Solution
Berücksichtigung eigener Prozesse
Fehlende Shortcut-Unterstützung
Debugging, Haltepunkte, Launch() statt Break(), Eigenes Debugfenster, gelegentliche Abstürze
Der eigentliche Komfort von VS wird auch nicht mit Zusatztools erreicht
u.a. Artikel zu MS Build Integration
Beispiele, Prozeduren, Dateien erstellen mit Ordner und solution-Struktur, Vorgefertigte Templates
VS AddIn
Ermöglicht vereinfachteres Ausführen von Text Templates während des Buildvorgangs
Alternative zu TextTransform.exe mit Batch-Files
sollte ein Sonderfall bleiben, wenn es nicht die eigenen sind, Bsp. T4 Self Tracking Entities
Arbeiten mit partial, Bsp. Schnittsteleenerweiterung
Nested Templates
Aufbereitung der Informationen
Ausgabe des Codes, Parametriesiertes Text Template, PreProcessed Template
Grauzonen zulassen, bevor Richtlinien lücken öffnen
Struktur
Logik
Sicherheitsaspekte
Kein Dogma, Glauben != Wissen
Leichter zu debuggen
Intellisense ohne Zusatztools, in der partial class
Syntax und Kompilercheck
Keine feste Abhängigkeit zu Visual Studio
In beliebigen .NET-Anwendungen verwendbar
Erweiterbar, partial class, virtual TransformText, tricky, im Gegensatz zu einfachen TextTemplates wird die GenerationEnvironment-Varialbe in der ersten Zeile auf null gesetzt, WriteLine-Anweisungen am Anfang der überschriebenen Methode sind in der Ausgabe nicht vorhanden
Generierten Code vor Änderungen schützen, bsp., Validierung
Preprocessed Texttemplates mit Referenzen zu anderen Dll´s, werden diese in normalen Textvorlagen verwendet, wird das auflösen dieser Dll´s tricky, Stichwort: Temp. AppDomain
Autor des Templates ist dafür verantwortlich, es werden keine Fehler erzeugt.
Output Directive
Assembly Direktive
Debug-Parameter
template property Inherits, fehlt, Implementiert Standardbasisklasse, Implementiert Standardmethoden von TextTransformation, vorhanden, Implementierung der Basisklasse ist Aufgabe des Templateautors, ohne Standardmethoden, Templateautor ist für Implementierung verantwortlich, in diesen Szenario kann auch der Einsatz von hostspecific nützlich sein
TextTemplatingFilePreprocessor
sehr aufwendig
Codeerstellung auf Basis von XML
Kosten-/Nutenverhältnis für eigenen Szenarien
Theoretisch Erzeugung von vb, jscript, c#, CodeSnippetCompileUnit
Erzeugung beliebiger Technologien nicht möglich, PHP, SQL
Teil der .NET Framework-Klassenbibliothek