Im Detail offenbart ein zu modellierender Ausschnitt einer Geschäftswelt eine große Vielfalt an Objekten, die allgeneiner betrachtet ein und derselben Klasse angehören. Beispielsweise können die Benutzer einer Webanwendung genauer betrachtet zu folgenden Unterklassen gehören:
Ein naheliegender Ansatz wäre eine Klassenbibliothek, welche über Vererbung die Mengen möglicher Benutzer und ihrer Rollen implementiert:
Eine allgemeine Benutzerklasse, die bei Bedarf um Admin- oder Autor- Methoden erweitert werden kann, bietet das Dekorator- Pattern (
Details hier).
var Anton = new User(); Anton.Name = "Anton"; // Anton als Admin var AntonAsAdmin = new AdminDeco(Anton); AntonAsAdmin.CreateNewUser("Berta"); // Anton als Author var AntonAsAuthor = new AuthorDeco(Anton); AntonAsAuthor.CreateNewDoc("X99", "Designpatterns- Leitfaden");
C# ermöglicht durch Erweiterungsmethoden die Dekoration von Klassen. So können z.B. versiegelte Klassen für eine Anwendung um Eigenaschften und Methoden erweitert werden. Die Erweitrung von IEnumerable im .NET Framework ist ein Beispiel.
public static class UserExt { public static System.Collections.ObjectModel.ObservableCollectionLogfile = new System.Collections.ObjectModel.ObservableCollection (); public static void Log(this User user, string LogMessage) { UserExt.Logfile.Add(string.Format("{0,8:s}: ({1}) {2}", DateTime.Now, user, LogMessage)); } } // ... Anwendung im Code var Anton = new User(); Anton.Name = "Anton"; // Erweiterungmethode (C# dekoriert Klassen !) Anton.Log("frisch angelegt");
Cross Cutting Concerns beschreiben Funktionen, die nicht zur Kernfunktionalität einer einzelnen Klasse
gehören, bei Bedarf aber dieser zugeornet werden sollen (Typische Auflistung hier).
Beispiele sind das Logging von Methodenaufrufen,
oder die Prüfung von Zugriffsberechtigungen beim Methodenaufruf.
Eine mögliche Implementierung von Cross Cutting Concerns sind
Dekoratoren. Dies wurde oben schon mittels der Erweiterungsmethode
Log implementiert.
Von Unity ausgelieferte Klassen können in Proxies eingepackt werden.
Diese fangen Aufrufe an die Methoden ab, und erlauben
so die vereinfachte Implementierung von Cross Cutting Concerns, indem sie unabhängig von bestimmten Klassen implementiert werden können.
Implementirung der Interception
Mittels des Builder- Desingpatterns können Filter- und Sortieroperationen der Repositories im Business- Layer erfolgreich von den Implemnetierungen abstrahiert werden.
Eine Einführung ins ADO.NET Entity- Framework gibt es Eine hier
Typisch für für den Einstieg in viele GUI- Baukästen wie Windows Forms, WPF oder ASP.NET Webforms
ist die Gestaltung einer kleinen grafischen Benutzeroberfläche (Dialog), und anschließend die Implementierung der
Geschäftslogik in den Event- Handlern der Steuerelemente der GUI (z.B. button_click(...)).
Die View (= grafische Oberfläche) wird hierbei dierekt an das Model durch Berechnungen in den
Event- Handlern gebunden. Das Muster wird als MV-Pattern bezeichnet.
Das MV- Muster ist für größere Projekte ungenügend: Große Teile der Geschäftslogik, die insbesondere Workflows beschreiben, müssen in den Eventhandlern der View implementiert werden. Dieser Teil der Geschäftslogik kann damit kaum getestet werden.
Abhilfe schafft das MVP Muster (= Model View Presenter). Der Presenter wird gegen die Schnittstellen des Models und der View programmiert:
class Presenter{ Pesenter(IView view, IModel model){...}}
. Die Workflows aus den Eventhandlern werden in Methoden des Presenters
ausgelagert, wie folgendes Bild zeigt
Eine Weitere Möglichkeit, Teile der Geschäftslogik aus dem den Eventhandlern des Page- Controllers einer Webform zu "verbannen", bietet das Architekturmuster
MVVM (=Model View ViewModel).