Um unsere Testdaten zu erstellen, verwenden wir die folgende Variante des Builder-Musters (vereinfachtes Beispiel!):
Beispielklasse:
%Vor%Der Erbauer:
%Vor%HINWEIS: Der Kontext des Beispiels selbst ist nicht relevant. Wichtig ist hier, wie in diesem Beispiel eine Builder-Klasse wie PersonBuilder vollständig erzeugt werden kann, indem man sich die Entity-Klasse (Person) anschaut und das gleiche Muster anwendet - siehe unten.
Stellen Sie sich nun vor, dass die Personenklasse 15 Eigenschaften anstelle von 2 hat. Die Implementierung der Builder-Klasse würde einige Monkeyworks erfordern, während sie theoretisch automatisch aus der Person-Klasse generiert werden könnte. Wir könnten die Code-Generierung verwenden, um die Builder-Klasse schnell einzurichten und bei Bedarf später benutzerdefinierten Code hinzuzufügen.
Der Codegenerierungsprozess müsste sich des Kontexts (Name und Eigenschaften der Personenklasse) bewusst sein, so dass sich einfache textbasierte Codegenerierung oder Regex-Magie hier nicht richtig anfühlt. Eine Lösung, die dynamisch, nicht textbasiert ist und innerhalb von Visual Studio schnell ausgelöst werden kann, wird bevorzugt.
Ich suche nach der besten Möglichkeit, Code-Generierung für solche Szenarien durchzuführen. Betrachtung? Codesmith? T4 Vorlagen? Reshaper Live Templates mit Makros?
Ich freue mich auf ein paar tolle Antworten:)
Die T4-Lösung ist eine gut integrierte Visual Studio-Option. Sie können Reflektion innerhalb der T4-Vorlage verwenden, um den Code tatsächlich zu generieren.
Wir haben eine Funktion in CodeSmith Generator 5.x hinzugefügt, mit der Sie aus vorhandenem Code generieren können. Bitte sehen Sie sich die Dokumentation hier an . Sie können auch Reflection oder eine beliebige .NET-Bibliothek in einer CodeSmith Generator-Vorlage verwenden.
Danke -Blake Niemyjski
Wenn es sich nur um einen Test handelt, betrachten Sie ein spöttisches Framework wie RhinoMocks:
%Vor%Auf diese Weise kann sich Ihr Builder mit Ihren Anforderungen weiterentwickeln. Außerdem müssen Sie die Build-Methode nicht ändern. Fügen Sie einfach "WithX" -Methoden hinzu.
Sehen Sie sich den ABSE Modellierungsansatz und seine IDE an, AtomWeaver . ABSE ist ein vorlagenbasiertes Modellierungs- und Codegenerierungsframework, bei dem ein Modell (das nichts mit UML oder MDA zu tun hat) durch Anwenden von "Bausteinen" (Atoms) erzeugt wird. Diese Atome sind Template / Programm-Hybride und sind kontextsensitiv: Ein Atom kann Code entsprechend seiner Platzierung im Baum und der Anwesenheit / Abwesenheit bestimmter Atome erzeugen.
Der Modell-Host (in diesem Fall AtomWeaver) "führt" das Modell aus, um den gewünschten Quellcode zu erhalten. Das Modell kann "die Quelle" sein: Ändern Sie das Modell und regenerieren Sie es so oft wie nötig.
AtomWeaver ist nicht in Visual Studio integriert, kann aber ohne Probleme zusammenarbeiten.
Tags und Links visual-studio reflection resharper code-generation codesmith