Applikationsarchitektur modularer Rich Client-Anwendungen am Beispiel der Windows Presentation...

32
Applikationsarchitektur modularer Rich Client-Anwendungen am Beispiel der Windows Presentation Foundation Jörg Jooss MTC Architect [email protected] http://blogs.msdn.com/mtcmuc/ OOP 2009

Transcript of Applikationsarchitektur modularer Rich Client-Anwendungen am Beispiel der Windows Presentation...

Page 1: Applikationsarchitektur modularer Rich Client-Anwendungen am Beispiel der Windows Presentation Foundation Jörg Jooss MTC Architect joerg.jooss@microsoft.com.

Applikationsarchitektur modularer Rich Client-Anwendungen am Beispiel der

Windows Presentation Foundation

Jörg JoossMTC Architect

[email protected]://blogs.msdn.com/mtcmuc/

OOP 2009

Page 2: Applikationsarchitektur modularer Rich Client-Anwendungen am Beispiel der Windows Presentation Foundation Jörg Jooss MTC Architect joerg.jooss@microsoft.com.

2

Das SzenarioDesign Patterns, Composite Application Library (CAL)

Modulare Anwendung mit deutlicher höherer Software-Qualität überführen

Page 3: Applikationsarchitektur modularer Rich Client-Anwendungen am Beispiel der Windows Presentation Foundation Jörg Jooss MTC Architect joerg.jooss@microsoft.com.

3

Hintergrund: Qualitätsmerkmale

Maintainability: A set of attributes that bear on the effort needed to make specified modifications

(ISO 9126)

Stability Analyzability Changeability Testability

Page 4: Applikationsarchitektur modularer Rich Client-Anwendungen am Beispiel der Windows Presentation Foundation Jörg Jooss MTC Architect joerg.jooss@microsoft.com.

Iteration 0: „Die Applikation“

Demo

Page 5: Applikationsarchitektur modularer Rich Client-Anwendungen am Beispiel der Windows Presentation Foundation Jörg Jooss MTC Architect joerg.jooss@microsoft.com.

5

Iteration 0: Bestandsaufnahme

Beobachtungen

• Autonomous View (Anti-)Pattern: Applikationslogik und Präsentationslogik sind vermischt• Fehlende Abstraktionen• 95% der Applikationslogik liegen in einer Methode• Unit Testing sehr schwierig• Code bietet kaum Möglichkeiten zur Aufteilung zwischen Teams• Erweiterungen nach dem gleichen Entwicklungsansatz führen unweigerlich zum „Big Ball of Mud“

Software-Qualität

Page 6: Applikationsarchitektur modularer Rich Client-Anwendungen am Beispiel der Windows Presentation Foundation Jörg Jooss MTC Architect joerg.jooss@microsoft.com.

6

Iteration 1: Separate Presentation

Um den Big Ball of Mud zu verhindern, müssen wir die Präsentation vom Rest

der Anwendung trennen

Konkrete Design Patterns:• Model-View-Controller• Model-View-Presenter• Presentation Model

WPF und CAL geben jeweils keinen Ansatz vor – aber in WPF ist Presentation

Model sehr einfach zu realisieren

Page 7: Applikationsarchitektur modularer Rich Client-Anwendungen am Beispiel der Windows Presentation Foundation Jörg Jooss MTC Architect joerg.jooss@microsoft.com.

7

Hintergrund: Presentation ModelBenutzerinteraktion

View

Presentation Model

Business Logic

Businessness LogicAPI

Events

Commands Data Binding

Page 8: Applikationsarchitektur modularer Rich Client-Anwendungen am Beispiel der Windows Presentation Foundation Jörg Jooss MTC Architect joerg.jooss@microsoft.com.

8

Hintergrund: Commands

Receiver+Action<T>+Func<T, bool>

ICommand+Execute+CanExecute+CanExecuteChanged

DelegateCommand

+Execute+CanExecute+CanExecuteChanged

Invoker In CAL

In WPF

Page 9: Applikationsarchitektur modularer Rich Client-Anwendungen am Beispiel der Windows Presentation Foundation Jörg Jooss MTC Architect joerg.jooss@microsoft.com.

Iteration 1: Shell und Presentation Model

Code…

Page 10: Applikationsarchitektur modularer Rich Client-Anwendungen am Beispiel der Windows Presentation Foundation Jörg Jooss MTC Architect joerg.jooss@microsoft.com.

11

Iteration 1: Bestandsaufnahme

Beobachtungen

• View enthält keine Anwendungslogik und ist vom Presentation Model entkoppelt• Unit Testing des PM möglich (Unit Test als alternativer View)• Applikationslogik kann nach Belieben realisiert werden• Die Features von WPF (Datenbindung, Commands etc.) werden genutzt • Mehr als ein leeres Fenster haben wir jetzt aber nicht…

Software-Qualität

Page 11: Applikationsarchitektur modularer Rich Client-Anwendungen am Beispiel der Windows Presentation Foundation Jörg Jooss MTC Architect joerg.jooss@microsoft.com.

12

Iteration 2: File → Open → …?

Wie zeigen wir ein Dialogfenster an, ohne das Presentation Model ad absurdum zu

führen?

Einfachste Lösung: Indirektion – Auslagern in eine andere Komponente

„Service“ = Interface + Implementierung(en)

Page 12: Applikationsarchitektur modularer Rich Client-Anwendungen am Beispiel der Windows Presentation Foundation Jörg Jooss MTC Architect joerg.jooss@microsoft.com.

13

Iteration 2: File → Open → …? (cont’d)

Vermeide Abhängigkeiten zwischen Shell und Applikationskomponenten – wie aber

werden Informationen aus der Shell propagiert?

C#-Events helfen nicht –der Subscriber kennt den Publisher

bereits zur Buildtime

CAL stellt den Event Aggregator als Publish/Subscribe-Mechanismus bereit

Page 13: Applikationsarchitektur modularer Rich Client-Anwendungen am Beispiel der Windows Presentation Foundation Jörg Jooss MTC Architect joerg.jooss@microsoft.com.

14

Hintergrund: Event Aggregator

Publisher Subscriber

Publisher

Subscriber

Subscriber

Event Aggregator

CompositeWpfEvent<T>

CompositeWpfEvent<U>

Page 14: Applikationsarchitektur modularer Rich Client-Anwendungen am Beispiel der Windows Presentation Foundation Jörg Jooss MTC Architect joerg.jooss@microsoft.com.

Iteration 2: Events und Services

Code…

Page 15: Applikationsarchitektur modularer Rich Client-Anwendungen am Beispiel der Windows Presentation Foundation Jörg Jooss MTC Architect joerg.jooss@microsoft.com.

17

Iteration 2: Bestandsaufnahme

Beobachtungen

• Konsumenten von Ereignissen in der Shell bleiben durch Publish/Subscribe lose gekoppelt• Bereitstellung technischer Funktionen als Services erhöht Testbarkeit• FILECHANGEDEVENT ist momentan die einzige Gemeinsamkeit zwischen Provider (Shell) und

potentiellen Konsumenten• Es fehlt jedoch die Integration der Services

Software-Qualität

Page 16: Applikationsarchitektur modularer Rich Client-Anwendungen am Beispiel der Windows Presentation Foundation Jörg Jooss MTC Architect joerg.jooss@microsoft.com.

18

Iteration 3: Connecting the Dots

Wir wollen die losen Teile (Shell, Presentation Model, Services) verbinden,

zugleich aber die Verbindungen leicht ändern können

Dependency Injection-Container erlauben die Konstruktion von Objekten und deren

Abhängigkeiten

CAL bietet• Dependency Injection-Container

(Unity)• Bootstrapper

Page 17: Applikationsarchitektur modularer Rich Client-Anwendungen am Beispiel der Windows Presentation Foundation Jörg Jooss MTC Architect joerg.jooss@microsoft.com.

19

Kern eines Depedency

Injection Containers

Hintergrund: Dependency Injection

BuilderIService

ServiceImpl

Client<<creates>>

<<injects>>

Page 18: Applikationsarchitektur modularer Rich Client-Anwendungen am Beispiel der Windows Presentation Foundation Jörg Jooss MTC Architect joerg.jooss@microsoft.com.

Iteration 3: Bootstrapper und Dependency Injection

Code…

Page 19: Applikationsarchitektur modularer Rich Client-Anwendungen am Beispiel der Windows Presentation Foundation Jörg Jooss MTC Architect joerg.jooss@microsoft.com.

22

Iteration 3: Bestandsaufnahme

Beobachtungen

• Abhängigkeiten zwischen den Komponenten sind nicht hart codiert, sondern über Dependency Injection flexibel änderbar

• Testkonfigurationen können so das System entsprechend rekonfigurieren und Stubs, Fakes etc. verwenden

• Wir haben immer noch nur ein leeres Fenster…

Software-Qualität

Page 20: Applikationsarchitektur modularer Rich Client-Anwendungen am Beispiel der Windows Presentation Foundation Jörg Jooss MTC Architect joerg.jooss@microsoft.com.

23

Iteration 4: Module für die Massen

Wir wollen ein Konstrukt bereitstellen, das die eigentliche Anwendungslogik über alle Schichten kapselt – Module

Solche Module können auf verschiedene Weise geschnitten werden:• Infrastrukturkomponenten• Anwendungsfeatures• Subsysteme

CAL bietet die Infrastruktur zur Bereitstellung von Assemblies als Module

Page 21: Applikationsarchitektur modularer Rich Client-Anwendungen am Beispiel der Windows Presentation Foundation Jörg Jooss MTC Architect joerg.jooss@microsoft.com.

Iteration 4: Views und Services in einem Modul

Code…

Page 22: Applikationsarchitektur modularer Rich Client-Anwendungen am Beispiel der Windows Presentation Foundation Jörg Jooss MTC Architect joerg.jooss@microsoft.com.

26

Iteration 4: Bestandsaufnahme

Beobachtungen

• Ein Modul ist ein mehrschichtiger, in sich abgeschlossener Applikationsbaustein• Wie die Shell verwendet es PM, Commands, Pub/Sub und User Controls als Views• Hohe Kohäsion, niedrige Kopplung• Event Aggregator erleichtert Thread Marshalling• Die Implementierung verschiedener Module kann auf mehrere Teams aufgeteilt werden• Aber was macht eine Assembly eigentlich zum Modul?

Software-Qualität

Page 23: Applikationsarchitektur modularer Rich Client-Anwendungen am Beispiel der Windows Presentation Foundation Jörg Jooss MTC Architect joerg.jooss@microsoft.com.

27

Iteration 5: I, Module

Uns fehlt eine Möglichkeit das Modul zu initialisieren (Bootstrapper?)

Kennzeichnung von „Modulkomponenten“• Attribute• Interfaces• Basisklassen• Konvention

CAL sucht in einer Assembly nach Typen, die IMODULE implementieren

Page 24: Applikationsarchitektur modularer Rich Client-Anwendungen am Beispiel der Windows Presentation Foundation Jörg Jooss MTC Architect joerg.jooss@microsoft.com.

Iteration 5: Das IModule

Code…

Page 25: Applikationsarchitektur modularer Rich Client-Anwendungen am Beispiel der Windows Presentation Foundation Jörg Jooss MTC Architect joerg.jooss@microsoft.com.

30

Iteration 5: Bestandsaufnahme

Beobachtungen

• Ein IMODULE agiert wie ein modulspezifischer Bootstrapper • Wie in der Shell können so Abhängigkeiten im Modul per DI konfiguriert werden• Abhängigkeiten des Moduls werden von CAL injiziert• Wie aber bringen wir Module zur Ausführung?

Software-Qualität

Page 26: Applikationsarchitektur modularer Rich Client-Anwendungen am Beispiel der Windows Presentation Foundation Jörg Jooss MTC Architect joerg.jooss@microsoft.com.

31

Iteration 6: How to Be Found and Seen

Die Shell benötigt Mechanismen zum Finden von Modulen und Platzhalter zur

Anzeige von Views

Direkte Referenzen zwischen Shell und Modulen führen zu enger Kopplung

CAL bietet• Module Enumerators• Regions

Page 27: Applikationsarchitektur modularer Rich Client-Anwendungen am Beispiel der Windows Presentation Foundation Jörg Jooss MTC Architect joerg.jooss@microsoft.com.

32

Hintergrund: Regions

<ContentControl cal:RegionManager.RegionName=

"{x:Static fx:RegionNames.MainRegion}" />

Name der RegionTipp: Binden statt hart

codieren

ContentControls, Selectors, und

ItemControls können mit Regionen dekoriert

werden

Page 28: Applikationsarchitektur modularer Rich Client-Anwendungen am Beispiel der Windows Presentation Foundation Jörg Jooss MTC Architect joerg.jooss@microsoft.com.

Iteration 6: Die modulare Anwendung

Demo

Page 29: Applikationsarchitektur modularer Rich Client-Anwendungen am Beispiel der Windows Presentation Foundation Jörg Jooss MTC Architect joerg.jooss@microsoft.com.

35

Iteration 6: Bestandsaufnahme

Beobachtungen

• Die Shell muss Regionen zur Anzeige von Views vorsehen und benennen• Shell und Module/Views sind komplett entkoppelt, kennen jeweils nur

Regionenbezeichner und Ereignisse• Die Strategie zum Finden von Modulen ist austauschbar

Software-Qualität

Page 30: Applikationsarchitektur modularer Rich Client-Anwendungen am Beispiel der Windows Presentation Foundation Jörg Jooss MTC Architect joerg.jooss@microsoft.com.

36

Zusammenfassung

Modulare WPF-Anwendungen mit der Composite Application Library

Commands/Events

Services/Container

Bootstrapper

ModuleRegions/

Views

Page 31: Applikationsarchitektur modularer Rich Client-Anwendungen am Beispiel der Windows Presentation Foundation Jörg Jooss MTC Architect joerg.jooss@microsoft.com.

37

Ressourcen

Composite Application Guidance und CAL

• http://www.codeplex.com/CompositeWPF• http://msdn.microsoft.com/en-us/library/cc707819.aspx

patterns & practices Developer Center

• http://msdn.microsoft.com/en-us/practices/default.aspx

MTC München Team Blog (Code zur Session)

• http://blogs.msdn.com/mtcmuc/

Page 32: Applikationsarchitektur modularer Rich Client-Anwendungen am Beispiel der Windows Presentation Foundation Jörg Jooss MTC Architect joerg.jooss@microsoft.com.