Aspektorientierte Programmierung (AOP) ist eine
Programmiertechnik, die allein das Ziel hat, verschiedene logische Aspekte
(Ansichten) getrennt voneinander zu entwerfen, zu entwickeln und zu testen. Zu
den Aspekten zählen meist folgende Anforderungen: Transaktionen, Auditfähigkeit
und Logging. Die getrennt entwickelten Aspekte werden dann zur endgültigen
Anwendung zusammengefügt. Durch die flexiblen Vorteile, hat das AOP in der
.NET-Softwarearchitektur einen großen Platz gefunden. Für .NET gibt es bereits zahlreiche AOP-Frameworks, einer
der ansehnlichsten von Ihnen ist PostSharp. Das zusätzlich seit dem 23 Juli 2008
mit der Version 1.5 (CTP), nun auch das Compact Framework unterstützt. Es
handelt sich hierbei um ein Open-Source Projekt, das somit Kostenlos, Privat und Kommerziell
eingesetzt werden darf. Auf der Website von PostSharp, wird ein Video angeboten,
wie AOP mit PostSharp unter dem .NET Framework verwendet wird.
http://www.postsharp.org/about/video/default.aspx
Logging unter Compact
Framework
Als Beispielanwendung für das Compact Framework, soll eine Logging
Funktion dienen. Als Logger wird NLog verwendet. NLog gehört auch zu einem
Open-Source Projekt das eine Unterstützung für das Compact Framework anbietet.
PostSharp und NLog müssen nun noch Heruntergeladen und Installiert werden.
(PostSharp, http://www.postsharp.org/download/1.5/) - (NLog, http://sourceforge.net/project/showfiles.php?group_id=116456)
Das Projekt wurde für Windows Mobile 6 Standard mit dem
Namen PostSharp.MobileExample erzeugt.
Auf der Form befinden sich zwei Labels (lblName,
lblHalloName) und eine TextBox (txtName),
zusätzlich bietet das Menü links unten eine Ok-Funktion. (Siehe Abb. 1)
Abb. 1: Der Aufbau der Form, zwei Labels, eine TextBox und
das Menü links unten.
Damit PostSharp und NLog verwendet werden kann, müssen die
jeweiligen Assemblys (DLL-Dateien) unter Verweise als Referenz hinzugefügt werden.
Folgende Dateien sind unter den Installationsverzeichnisen mit dem Merkmal auf CF2.0,
oder der Dateiendung CF zu finden. PostSharp.Laos.CF.dll,
PostSharp.Public.CF.dll und NLog.dll. (Siehe Abb.2 und 3)
Abb. 2: PostSharp Assemblys für das Compact Framework.
Abb. 3: NLog Assembly für das Compact Framework.
Anschließend wird die Logging Funktion in eine eigene Klasse
(Logging.cs) ausgelagert. Hier werden mittels Using und dem Namespace´s von PostSharp und NLog, die
Assemblys eingebunden. Als nächstes muss die Klasse das
Attribut [Serializable] tragen. Nun
bietet PostSharp eine Basisklasse mit dem Namen OnMethodBoundaryAspect
an. Das bedeutet soviel wie - "An der Methode angrenzender
Aspekt!". Nun wird die Möglichkeit gegeben, den Ablauf von Methoden
abzufangen. So ähnlich als gäbe es Event´s mit - "Wenn Methode aufgerufen
wird", "Wenn Methode verlassen wird" und "Wenn Methode
einen Fehler ausgibt". Genau solche Methoden bietet uns die Basisklasse.
Mittels override können wir
diese Methoden benutzen.
|
Methode
|
Bedeutung
|
|
OnEntry
|
Wenn
Methode aufgerufen wird
|
|
OnExit
|
Wenn Methode
verlassen wird
|
|
OnException
|
Wenn
Methode einen Fehler ausgibt
|
Abb. 4: Aufbau von Logging.cs.
Bei NLog ist nun ein ganz Wichtiger Punkt zu beachten, für
die XML-Konfigurationsdatei muss eine eigene Datei dienen. Unter
Windows kann die Konfiguration in der App.Config ausgelagert werden, das unter Compact Framework definitiv nicht funktioniert. Bei diesem Beispiel wurde eine NLog.config-Datei erzeugt. Der Aufbau
ist selbsterklärend, siehe Abb.5.
Abb. 5: Die NLog.config-Datei.
Nun steht eine fertige AspectLogging-Funktion für das
Compact Framework zur Verfügung. Wie kann man nun das Logging als Aspekt
einsetzen? Als Aspekt bei der Entwicklung unter .NET, zählen nur die Funktionen
einer Methode. Das bedeutet, hier soll eine klare Sicht auf den WICHTIGEN Code
dienen. Solche Funktionen wie das Logging oder Transaction, stören die klare
Sicht dabei, wie zeilenlange Kommentare. Nun wird die AspectLogging-Klasse via
Attribut (GuideToCsharp - Attribute, http://www.guidetocsharp.de/Attributes.aspx)
über die nun gewollten Methoden oder über der Klassen-Definition für alle Methoden vergeben.
Das Attribut wird mit dem Klassennamen der Aspectklasse angepsochen, bei
diesem Beispiel ist es [Logging]. Um ein verständlicheres Bild zu erhalten,
siehe Abb. 6.
Abb. 6: Die Form1.cs-Datei mit eingebundenem
Logging-Aspect.
Wenn die Aspectklasse sich im selben Namespace befindet,
kann auf eine Bindung via Using
verzichtet werden. Beim Starten des Beispiels, wird dem Benutzer die Form mit
der Namenseingabe angeboten. Nach der Eingabe kann mit dem Ok, die Begrüßung
statt finden. Intern wird von der TextBox der Wert einer Methode übertragen,
was durch das Attribut automatisch mit geloggt wird. Auf dem Mobilen gerät,
wird wie in der NLog.config vergeben, ein Verzeichnis mit NLog erzeugt, siehe
Abb. 8.

Abb. 7: Die Beispiel-Anwendung.
Abb. 8: Ein neues Verzeichnis mit NLog.
Im Verzeichnis befindet sich dann die gewünschte Log-File
mit dem Vorgang des Methoden Aufrufs und er Übermittlung des Textes. Siehe dazu
Abb. 9 und 10.
Abb. 9: log.txt-Datei auf dem Mobilen Gerät.
Abb. 10: Inhalt
der Logfile.
Abb. 11: Alle Dateien auf kurzen Blick.
Die Informationen überträgt PostSharp via eventArgs, siehe dazu
Abb. 4. Es wird empfohlen ein wenig zu Experimentieren und die Aspectklasse zu
Debuggen. Es ist erstaunlich in wie weit die Informationen abgefangen werden
können. Wie sieht es hier mit der Performance aus? Gerade auf den Mobilen
Geräten muss auf Performance geachtet sein, PostSharp hat hier eine sehr flinke Art sich dementsprechend in die Methoden zu hacken. PostSharp hängt sich
an den MSBUILD-Compiler vom .NET-Framework und implementiert die eigentliche
Klasse in sich selbst. Mittels Reflector soll die Form1.cs noch einmal
betrachtet werden, dazu siehe Abb. 12.
Abb. 12: Form1.cs, nach dem Kompilieren.
Leider bietet PostSharp nur wenig der Interessantesten Funktionen
in der Compact Version an. Neben der Klasse von OnMethodInvocationAspect,
die den Inhalt der Methoden abfangen kann, fehlt somit ein wichtiges Feature.
Damit wäre das Cachen von Datenabfragen ermöglicht, was eben sehr Interessant
für die Performance ist. PostSharp für das Compact Framework ist allerdings
noch "Jung" und auch nur in der CTP Version erhalten. Wir können also gespannt abwarten, ob sich etwas in der kommenden Release ändert.
Das Beispiel zum Downloaden:
PostSharp.MobileExample.zip (407,97 kb)
Wenn ihnen der Artikel gefallen hat oder er für sie hilfreich war, bitten "kicken" sie ihn.
