Aspektorientierte Programmierung mit dem Compact Framework

by Gregor Biswanger 4. August 2008 13:53

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.
kick it on dotnet-kicks.de

Kommentare

Powered by BlogEngine.NET 1.4.5.0
Theme by Extensive SEO

Über den Autor

Gregor Biswanger

Microsoft MVP für Client App Dev
XING

Gregor Biswanger (Microsoft MVP für Client App Dev) ist freier Consultant, Trainer, Autor und Speaker.


Seine Schwerpunkte liegen im Bereich der .NET-Architektur, agilen Prozessen und XAML. Er veröffentlichte vor kurzem seine DVD´s mit Video-Trainings zum Thema „Meine erste Windows 8 App“, „Windows Store Apps mit XAML und C#“ und „WPF 4.5 und Silverlight 5“ bei Addison-Wesley von video2brain.


Biswanger ist auch im Auftrag von Intel GmbH als Technologieberater für die Intel Developer Zone aktiv und ist Leader bei der Ingolstädter .NET Developers Group (INdotNET). 

 

Video über mich:
http://www.youtube.com/watch?v=mx_6SiiLxjk


Basta! 2011 Speaker

CLIPer

MCTS
Windows SharePoint Services 3.0 – Application Development (MCTS)