Codegenerierung aus Modeling Projects – Part 1

Visual Studio unterstützt die Generierung von Code aus einem Modeling Project heraus. Dabei kommen t4 Templates zum Einsatz. Diese können auch erweitert und angepasst werden. Hier eine kleine Anleitung, wie man sinnvoll Code aus einem Model generieren kann. In Teil 1 ist die Standardfunktionalität beschrieben. In Teil 2 werde ich die Anpassung von den T4-Templates beschreiben. In Teil 3 werde ich schließlich ein eigenes Profil mit eigenen Stereotypen erstellen und die Codegenerierung “customizen”.

Beginnen Sie zunächst mit einem Package.

image

Dem Package können folgende Eigenschaften zugewiesen werden:

image

Der Name des Paketes entspricht dem C#-Namensraum und optional einem Ordner im Zielprojekt. Über den Stereotype “C# namespace” können auch noch weitere Using-Direktiven hinzugefügt werden. Natürlich können Packages auch verschachtelt werden. Dadurch kann eine Ordner und Namensraumhierarchie hergestellt werden.

Fügen Sie jetzt eine Klasse mit einigen Eigenschaften und Methoden hinzu.

image

Die Description wird als Kommentar in den Summary-Tag geschrieben. Wenn man weitere Kommentare mit der Klasse verbindet, dann werden diese in die XML-Remarks-Kommentare geschrieben. Über den Stereotype “C# class” können wir Attribute über die Eigenschaft ClrAttributes kommagetrennt eingeben.

image

Für Properties und Methoden gilt das gleiche, wie für die Klasse. Die Description wird als XML-Kommentar umgesetzt. Über ClrAttributes können wir Attribute setzen.

image

Über einen rechtsklick im Diagramm können wir uns jetzt den Code generieren. Das Ergebnis sieht wie folgt aus:

//------------------------------------------------------------------------------
// 
//     This code was generated by a tool
//     Changes to this file will be lost if the code is regenerated.
// 
//------------------------------------------------------------------------------
namespace MyCompany.ProjectNamespace
{
	using System;
	using System.Collections.Generic;
	using System.ComponentModel;
	using System.ComponentModel.DataAnnotations;
	using System.Linq;
	using System.Runtime.Serialization;
	using System.Text;

	///<br />
	/// The summary description of the class.
	/// 
<br />	/// Remark-Comments for the class.
	[Serializable, DataContract(Namespace="http://alegri.eu/schemas")]
	public class Class1
	{
		///<br />
		/// This is the summary of Attribute 1.
		/// 
<br />		[DataMember,Required]
		public virtual string Attribute1
		{
			get;
			set;
		}

		///<br />
		/// This is the summary of Attribute 2.
		/// 
<br />		[DataMember,Required]
		public virtual int Attribute2
		{
			get;
			set;
		}

		///<br />
		/// This The description of Operatrion 1.
		/// 
<br />		public virtual int Operation1(int i)
		{
			throw new System.NotImplementedException();
		}

		///<br />
		/// This The description of Operatrion 1.
		/// 
<br />		public virtual string Operation2()
		{
			throw new System.NotImplementedException();
		}

	}
}

Für den Anfang nicht schlecht – trotzdem gibt es den Bedarf die Codegenerierung anzupassen. Z.B. damit Coding-Standards eingehalten werden. Dies werde ich im zweiten Teil der Serie beschreiben.

One comment

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s