Wie erzeuge ich Code basierend auf einer anderen Klasse?

9

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:)

    
Bram De Moor 22.03.2011, 14:08
quelle

4 Antworten

2

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.

    
Felice Pollano 22.03.2011 14:12
quelle
2

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

    
Blake Niemyjski 23.03.2011 16:26
quelle
0

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.

    
Morten 23.03.2011 14:11
quelle
0

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.

    
Rui Curado 24.03.2011 15:41
quelle