b2aat6n
b2aat6n
b2aat6n
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
[Abb. 10] Controls<br />
im Panel.<br />
sem Panel entfernt werden. Um dies zu<br />
vereinfachen, ist das zugehörige Panel an<br />
der Tag-Eigenschaft des Buttons gesetzt. So<br />
„weiß“ der Button, zu welchem Panel er<br />
gehört und kann dieses aus dem umschließenden<br />
Panel entfernen.<br />
Wird im Portal die Schaltfläche Generieren<br />
angeklickt, muss für jede Spaltenbeschreibung<br />
eine ColumnDefinition erzeugt<br />
werden, um dann die Testdaten zu generieren.<br />
Dazu wird die Liste der Spaltenbeschreibungen<br />
im statischen Panel durchlaufen.<br />
Darin befindet sich jeweils ein Textfeld,<br />
das den Namen der Spalte enthält. Ferner<br />
befindet sich im Platzhalterpanel ein<br />
Control, in dem die Parameter für den Generator<br />
enthalten sind. In der Dropdownliste<br />
enthält das SelectedItem eine Spalten-<br />
Definition, aus der sich die ColumnDefinition<br />
erstellen lässt. Dazu wird aus der SpaltenDefinition<br />
die Funktion zum Erzeugen<br />
der ColumnDefinition aufgerufen.<br />
Insgesamt hat das Erstellen des Portals<br />
knapp zwei Stunden in Anspruch genommen.<br />
Automatisierte Tests habe ich dazu<br />
fast keine erstellt. Diese würde ich allerdings<br />
in einem „echten“ Projekt im Nachhinein<br />
ergänzen, da die Logik für den dynamischen<br />
Aufbau des Portals doch recht<br />
umfangreich geworden ist. Um hier bei<br />
späteren Erweiterungen Fehler auszuschließen,<br />
würde ich die typischen Bedienungsschritte<br />
eines Anwenders automatisiert<br />
testen.<br />
Host<br />
Am Ende benötigen wir für die gesamte<br />
Anwendung noch eine EXE-Datei, mit der<br />
die Anwendung gestartet werden kann.<br />
Aufgabe dieses Hosts ist es, die benötigten<br />
Komponenten zu beschaffen und sie den<br />
Abhängigkeiten gemäß zu verbinden. Die<br />
Abhängigkeiten sind hier in Form von Konstruktorparametern<br />
modelliert. Folglich<br />
muss der Host die Komponenten in der<br />
richtigen Reihenfolge instanzieren, im Abhängigkeitsbaum<br />
von unten nach oben,<br />
von den Blattknoten zur Wurzel. Anschließend<br />
übergibt er die Kontrolle an das Portal.<br />
Für die vorliegende Anwendung, bestehend<br />
aus einer Handvoll Komponenten, ist<br />
diese Aufgabe trivial. Bei größeren Anwendungen<br />
kostet diese Handarbeit Zeit und<br />
sollte automatisiert werden. Die Grund-<br />
www.dotnetpro.de dotnetpro.dojos.2011<br />
LÖSUNG<br />
idee dabei ist: Man überlässt das Instanzieren<br />
der Komponenten einem DI-Container<br />
wie StructureMap [2] oder Castle Windsor<br />
[3]. Über ein eigenes Interface identifiziert<br />
man den Startpunkt der Anwendung, und<br />
los geht’s. Ein solcher Host kann dann sogar<br />
generisch sein und in allen Anwendungen<br />
verwendet werden.<br />
Denkbare Erweiterungen<br />
Für wiederkehrende Aufgaben wäre es<br />
sinnvoll, das Schema der Datengenerierung<br />
speichern und laden zu können. Dies<br />
kann beispielsweise mit dem Lounge Repository<br />
[4] erfolgen. In der Architektur<br />
würde dafür ein weiterer Adapter ergänzt,<br />
mit dem ein Schema gespeichert und geladen<br />
werden kann. Natürlich müssten im<br />
Portal entsprechende Anpassungen vorgenommen<br />
werden, um entsprechende Menüfunktionen<br />
zu ergänzen.<br />
Des Weiteren wäre es denkbar, die Generatoren<br />
zur Laufzeit dynamisch zu laden.<br />
Damit könnten Entwickler ihre eigenen<br />
Generatoren implementieren und verwenden,<br />
ohne dazu die gesamte Anwendung<br />
übersetzen zu müssen. Mithilfe eines DI-<br />
Containers wie StructureMap oder des<br />
Managed Extensibility Framework MEF [5]<br />
sollte auch diese Erweiterung keine große<br />
Hürde darstellen.<br />
Fazit<br />
Bei dieser Aufgabe stellte sich heraus, dass<br />
die Benutzerschnittstelle einer Anwendung<br />
durchaus einige Zeit in Anspruch<br />
nehmen kann. Die eigentliche Funktionalität<br />
war dagegen schnell entworfen und implementiert.<br />
Das lag maßgeblich daran,<br />
dass ich mir im Vorfeld einige Gedanken<br />
über die Architektur gemacht hatte. Danach<br />
ging die testgetriebene Entwicklung<br />
flüssig von der Hand. [ml]<br />
[1] Stefan Lieser, Meier, Müller, Schulze…,<br />
Testdaten automatisch generieren,<br />
dotnetpro 5/2010, Seite 108ff.,<br />
www.dotnetpro.de/A1005dojo<br />
[2] http://structuremap.sourceforge.net/<br />
[3] http://www.castleproject.org/container/<br />
[4] http://loungerepo.codeplex.com/ und Ralf<br />
Westphal, Verflixte Sucht, dotnetpro 11/2009,<br />
Seite 52f. www.dotnetpro.de/A0911Sandbox<br />
[5] http://mef.codeplex.com/<br />
Wir liefern passgenaue<br />
Strategien und Lösungen<br />
für Ihre Inhalte auf<br />
iPhone/iPad<br />
Android<br />
BlackBerry<br />
Windows Phone 7<br />
dem mobilen<br />
Browser<br />
Besuchen Sie<br />
uns unter<br />
www.digitalmobil.com