Web Client Software Factory Das Pattern & Practice Team vom Microsoft ist im Vergleich zu anderen Produktteams des Redmonder Konzerns wesentlich unbekannter. Ein Grund hierfür dürfte mitunter darin zu finden sein, dass es keine fertigen Produkte wie z.b. Visual Studio veröffentlicht. Dennoch sind die Veröffentlichungen dieses Teams gerade für mittlere bis größere Softwareprojekt wegweisend. Dieser Artikel gibt einen kleinen Überblick über eine der Veröffentlichungen dieses Teams: Die Web Client Software Factory, die vor kurzem in der Version 2.0 erschien. Von Tobias Müller Zu Beginn eines jeden neuen Projekts stellen sich meist dieselben Fragen: Wie soll die Architektur der Anwendung aussehen? In welche Teilprojekte kann die Solution aufgeteilt werden? In welcher Granularität kann die Anwendung modularisiert werden? Können einzelne Module autonom entwickelt werden? Welche Pattern bieten sich für den konkreten Anwendungsfall an? Wenngleich diese Liste über mehrere Seiten fortgeführt werden könnte, so reichen diese fünf Fragen für den Kontext des Artikels vollkommen aus. Selbst wenn nach der ersten Planungsphase eine grundlegende Architektur vorgegeben ist, so sind immer noch Feinheiten zu beachten: Die Antwort auf die Frage, ob einzelne Module autonom entwickelt werden können, wird im Normalfall noch mit einer gewissen Leichtigkeit zu beantworten sein, die Frage der Zusammenführung autonom entwickelter Module wird diese Antwort jedoch sehr wahrscheinlich nicht abdecken. Genau an diesem Punkt setzen Software Factories an. Abbildung 1: Zusammensetzung einer Software Factory Software Factory Dokumentation Tools Quellcode Patterns Designers Referenz Umsetzung Architektur Beschreibungen Visual Studio Templates und Recipes Application Blocks und Libraries QuickStarts und How Tos 40
WCSF SOFTWARE FACTORIES Aus Abbildung 1 ergibt sich, dass eine Software Factory im Allgemeinen aus den Bereichen Dokumentation, Tools und Quellcode besteht. Jede Software Factory bezieht sich hierbei auf eine Gruppe, oder auch Familie, von unterschiedlichen Einzelanwendungen. Das Interessante an einer Software Factory kristallisiert sich erst nach genauerer Betrachtung heraus. Durch das Wissen aus vielen Projekten in einem Spezialgebiet ergeben sich Best Practices, bestehend aus empfehlenswerten Patterns und Beschreibungen. Zu dieser Dokumentation werden eine oder mehrere entsprechende Referenzanwendungen umgesetzt. Die Erkenntnisse und Anforderungen aus dieser Referenzumsetzung wiederum führen zum einen zur Isolation häufig genutzter Quellcodeabschnitte, zum anderen zur Erweiterung der Dokumentation. Um was also handelt es sich bei der Web Client Software Factory? Die Microsoft WCSF fasst Dokumentation, Tools und Quellcode zur Umsetzung von transaktionsverarbeitenden Web Clients, die auf ASP.NET basieren, zusammen. Beispiele hierfür sind: e-banking/e-commerce-seiten Supply-Chain-Management-Webanwendungen Customer-Relationship-Management- Webanwendungen An der Entwicklung eines Projekts partizipieren die unterschiedlichsten Stakeholder. Im Rahmen dieses Artikels wollen wir uns etwas einschränken und konzentrieren uns auf die zwei, die für das Gelingen des Projekts aus technischer Sicht am wichtigsten sind: Architekten Als Architekt möchten Sie sicherstellen, dass Webanwendungen aus Ihrem Hause auf eine starke, qualitativ hochwertige und praxiserprobte Basis aufbauen. Entwickler Als Entwickler möchten Sie sich auf die Umsetzung der Geschäftslogik und die User Experience konzentrieren. Um mögliche technische Herausforderungen erkennen zu können, nehmen wir folgende Projektbeschreibung als Grundlage: Eine weltweit agierende Bank möchte eine neue, webbasierte Kundenanwendung veröffentlichen, die sowohl Geschäftsinformationen aus dem Investment Banking als auch dem Wealth Management bereitstellen Abbildung 2: Dependency Check soll. Für die Umsetzung dieses Projekts benötigen wir mindestens ein Architekturteam und, aufgrund der vollständig voneinander getrennten Geschäftsvorfälle, jeweils ein Programmierteam des Investment-Banking- sowie des Wealth- Management-Bereichs. Aus dem Anwendungsfall und der Anwendungsumgebung lassen sich einige technische Herausforderungen extrahieren: Modularität Testbarkeit Navigation Datensicherheit Authenifizierung Autorisierung Überprüfung von Eingabewerten Verteilung der Anwendungslogik Diese Auflistung dürfte Ihnen bekannt vorkommen. Für jene Anwendungsfamilie, die durch die WCSF abgedeckt Listing 1: Ergänzung des Interfaces für den DefaultView des Moduls SimpleTime public interface IDefaultView event EventHandler UpdateNowClicked; void UpdateNowTextBox(string currenttime); 41
Guidance Automation Extensions für VS2008 Guidance Automation Toolkit Enterprise Library for.net Framework (optional) wird, scheint es wahrscheinlich, dass sich ab einer gewissen Projektgröße die Herausforderungen angleichen. Bevor im weiteren Verlauf des Artikels auf die WCSF gezielt eingegangen wird, soll nicht verschwiegen werden, dass es sich bei der WCSF nur um eine von vier Software Factories im Rahmen der sogenannten Client Baseline Architectures handelt. Ergänzend werden für andere Clients angeboten: Smart Client Software Factory Web Service Software Factory Mobile Client Software Factory Abbildung 3: Guidance Navigator INSTALLATION Die Installation der Web Client Software Factory 2.0 setzt folgende Komponenten auf dem Zielsystem voraus: Guidance Automation Extensions und Toolkit können unter [3] heruntergeladen werden. Die Abhängigkeiten können im Installationstool der Version 2 bereits vor Installation manuell überprüft werden (Abbildung 2). Nach der Installation steht Ihnen unter dem Punkt Guidance Packages / Web Client Development February 2008 im Dialog New Project mögliche Web Client Solutions zur Verfügung, aufgeteilt nach Wunschsprache der Code-Behind-Dateien sowie der Zielplattform. Nach dem Start eines Projekts mit Unterstützung der WCSF steht Ihnen im Guidance Navigator sofort eine interaktive Hilfe zur Verfügung, die sich den aktuellen Schritten anpasst, zu jedem Schritt ausführliche Informationen gibt sowie die weitere Vorgehensweise beschreibt. Abbildung 5: Zusammenspiel CWAB, Webanwendung Modul 1 Webanwendung Modul 2 Composite Web Application Block Modul n Microsoft Visual Studio 2008 Microsoft.NET Framework Guidance Automation Extensions für VS2008 Object Builder Enterprise Library Abbildung 4: Orientierung Web Client Software Factory ARCHITEKTUR In der Standardauslieferung setzt die WCSF den Fokus wie in Abbildung 4 hervorgehoben auf die Bereiche Userinterface, Validation & Geschäftslogik. Selbstverständlich lassen sich weitere Module nachladen und in das Guidance Automation Toolkit einbinden. Wie bereits eingangs erwähnt und im Anwendungsfall umrissen, eignet sich die WCSF speziell für die modulare Entwicklung von Webanwendungen durch verschiedene Teams. Mit der WCSF werden Bundles (ehemals Application Blocks) mitgeliefert, die aus Dokumentation, Quellcode, Binärdateien, einem Guidance Package und einer Referenzimplementation bestehen. Sie können aus einem Repository heruntergeladen werden. Hiervon stehen folgende bereit: 42
WCSF AutoComplete Composite Web Client Automation Composite Web Client Libary Model-View-Presenter Modularity Responsive Composite Web Client Reference implementation Search Validation Abbildung 6: Aufbau Webanwendung APPLICATION BLOCKS Die WCSF verzichtet seit Version 2.0 auf den Page Flow Application Block. Beim Durchstöbern des Forums findet man jedoch schnell heraus, dass der mit Version 1.1 mitgelieferte Block auch unter Version 2.0 verwendet werden kann. Dieser Artikel beschränkt sich daher auf die Beschreibung des Composite Web Application Blocks. COMPOSITE WEB APPLICATION BLOCK Größere Line-Of-Business-Anwendungen (LOB) bestehen aus einzelnen in sich abgeschlossenen Funktionseinheiten. Abbildung 5 zeigt die Module. Aufgabe des Composite Web Application Blocks (CWAB) ist die Zusammenführung der einzelnen Module in eine Gesamtanwendung. Der CWAB baut auf dem Object Builder Framework auf, um einen Dependency Injector Container bereitzustellen. Hierdurch werden View, Businesslogik und Aufbereitung der Daten getrennt. Dies umgeht eine der größten Fallen der ASP.NET-Entwicklung bei größeren Objekten, die Vermischung von Businesslogik und View. Der Composite Web Application Block unterscheidet zwischen Business-Modul und Foundational-Modul. Ein Business-Modul bezeichnet hier eine abgeschlossene Einheit, die eine Menge von Anfragen beantworten können soll und eine eigene Webseite bereitstellt. Business-Module enthalten keine geteilte Funktionalität und verlinken sich entsprechend auch nicht gegenseitig. Basisfunktionalität, die über mehrere Module genutzt werden soll, wird in Foundational -Modulen bereitgestellt, die zwar Logik, aber keine eigene Webseite enthalten dürfen. Im Normfall wird Ihre Webanwendung so aufgebaut sein, dass sie eine Standardwebseite beinhaltet, die nicht Teil eines Business-Moduls ist. Wenn nun eine Anfrage eines Benutzers eintrifft, leitet der Web Application Block diese an das Business-Modul weiter, das die angefragte Webpage enthält. Das Business- Modul selbst kann auf Funktionalitäten eines oder mehrer Foundational-Module zugreifen. Im Normfall ist die Darstellungskomponente innerhalb eines Business-Moduls über das MVP-Pattern (Model View Presenter) separiert. Die Aufgaben des Application Blocks können zweigeteilt gesehen werden: Anwendungsstart Erzeugen der notwendigen Services: SiteMap Service, Authorization Service, SessionStateService, HttpcontextLocator Service Auffinden aller Business-Module Initialisierung der gefundenen Business-Module Anwendungslaufzeit DependencyInjection mithilfe von ObjectBuilder Abbildung 7: Beispielmodul 43
Listing 2: DefaultViewPresenter für Modul SimpleTime public class DefaultViewPresenter : Presenter<IDefaultView> private ISimpleTimeController _controller; public DefaultViewPresenter([CreateNew] ISimpleTi mecontroller controller) this._controller = controller; public override void OnViewLoaded() View.UpdateNowClicked += new EventHandler (View_UpdateNowClicked); void View_UpdateNowClicked(object sender, EventArgs e) View.UpdateNowTextBox (this._controller.getnowasstring()); Listing 1 zeigt IDefaultView, das von der Page Default.aspx implementiert wird. Der Presenter für diesen View, DefaultViewPresenter, erhält im Rahmen des CWAB über Dependency Injection eine Referenz auf den View und ebenso im Constructor eine Referenz auf den Controller (das Attribut [CreateNew] weist darauf hin). Wie in Listing 4 zu sehen ist, löst ein Klick auf den Button einen Event aus, der über OnUpdateNowClicked seinerseits einen Event auslöst. Dieser Event wurde in der Initia_lisierung (OnViewLoaded ist überschrieben) von DefaultViewPresenter abonniert. Er kann von hier über die Referenz auf den im Modul hinterlegten Controller (SimpleTimeController) an diesen weitergereicht werden. Die Referenzen zwischen diesen Ebenen sind über die jeweiligen Interfaces entkoppelt, was dazu führt, dass dem Presenter auch ein anderer Controller untergeschoben werden kann. Im Beispiel (Listing 3) gibt der Controller Date- Time.Now.ToLongTimeString() zurück und würde im Normalfall an dieser Stelle den entsprechenden Datenzugriff starten (siehe auch das MVP-Beispiel im Rahmen des mitgelieferten Quellcodes). Der DefaultViewPresenter wiederum ruft die im Interface IDefaultView definierte und in Default.aspx.cs des Modules SimpleTime implementierte Methode UpdateNowText- Box()auf (siehe Abbildung 8). Aufgabe des Views ist es nun, den erhaltenen Datenwert anzuzeigen. Listing 3 : SimpleTimeController und entsprechendes Interface PATTERNS Die Web Client Software Factory bietet Unterstützung bei der Einhaltung folgender Patterns: Application Controller Dependency Injection Inversion of Control Model-View-Presenter Module Interface Separation Responsiveness Patterns Service Locator Die Beschreibung aller Patterns würde den Rahmen dieses Artikels sprengen, daher konzentrieren wir uns im Folgenden auf das Model-View-Presenter Pattern und sehen in den Codelistings teilweise den Einfluss weiterer Patterns. MODEL-VIEW-PRESENTER Unser Beispiel kommt ohne echte Datenquelle aus und hat ausschließlich die Aufgabe, die Serverzeit in einer Textbox anzuzeigen. Das Modul wird über den ModuleInitializer in die zentrale Sitemap eingebunden und präsentiert dem Benutzer bei Auswahl in der Sitemap einen Button und eine Textbox. Beim Klick auf den Button wird die aktuelle Serverzeit in die Textbox eingetragen (siehe Abbildung 7). public interface ISimpleTimeController string GetNowAsString(); public class SimpleTimeController : ISimpleTimeController public SimpleTimeController() #region ISimpleTimeController Members public string GetNowAsString() return DateTime.Now.ToLongTimeString(); #endregion 44
WCSF Die kurzen Listings 1-4 zeigen die Kette der Abhängigkeiten, die über Dependency Injection aufgelöst wird. Dem View wird ein Presenter zugewiesen, dem zuvor noch ein Controller zugewiesen werden. Beides ist jeweils über das Attribute [CreateNew] erkennbar. ERWEITERBARKEIT DER WCSF Bei der WCSF handelt es sich um eine von der Community erweiterbare Basis einer Software Factory, die von Microsoft bereitgestellt wird. Bereits heute können weitere Application Blocks respektive Bundles ergänzt werden. Ebenso können im Rahmen des Guidance Toolkits neue Templates und Recipes, d.h. benutzerdefinierte Aktionen, in Visual Studio eingebunden werden. TESTBARKEIT DES CODES Aufgrund der Trennung im Rahmen des Model-View- Presenter Patterns kann die einem Modul zugrundliegende Businesslogik automatisiert bzw. mit Mock-Objekten getestet werden. Im Rahmen eines Entwicklungsleitfadens könnte auch festgelegt werden, dass jedes Business Modul entsprechende Testviews bereitstellen muss, über die semiautomatisch die Businesslogik getestet werden kann. DEPLOYMENT Das Deployment einer Webanwendung, die mithilfe der WCSF erstellt wurde, gestaltet sich denkbar einfach: 1. Kopieren der benötigten Assemblies auf den Ziel Webserver (Tabelle 1) 2. Kopieren der Module Abb. 8: A Wenn keine Services aus dem GAC genutzt werden, können die Assemblies per XCopy in das BIN-Verzeichnis der Webpage kopiert werden B Wenn Sie auf die Assemblies gemeinsam zugreifen wollen, installieren Sie diese in den GAC (entweder mit dem MS Installer, gacutil.exe oder mscorcfg.msc) ZUKUNFTSAUSSICHTEN Viele der fehlenden Features aus Version 1 und 1.1 sind mittlerweile mit der Version 2.0 nachgeliefert worden. In der Community schmerzlich vermisst wird der PageFlow Application Block, bei dem auf die Variante aus Version 1.1 zurückgegriffen werden muss. Einer etwas älteren Roadmap war zu entnehmen, dass Complex Page Flows nachgeliefert werden soll. Mit der erfolgten Auslieferung des Release 1.0 von Unity ist damit zu rechnen, dass auch die WCSF auf diesen Application Block umgestellt werden wird. Dem Blog einer der Entwickler ist zu entnehmen, dass bereits an dieser Umstellung gearbeitet wird; So finden sich heute bereits entsprechende Quellcodebeispiele für die Einbindung von Unity im Blog unter [05]. Ebenfalls bereitgestellt mit Version 2.0 wurde nunmehr eine lang gewünschte Referenzanwendung, die eine Einbindung von ASP.NET AJAX, ehemals Atlas, zeigt. In diesem Bereich dürften weitere Ergänzungen zu erwarten sein. ZUSAMMENFASSUNG Durch die konsequente Anwendung einer Software Factory lässt sich einfacher die Konsistenz des produzierten Codes innerhalb von unterschiedlichen Applikationen sicherstellen. Durch das Einhalten von Standards und die Anwendung der bekannten Patterns wird eine höhere Gesamtqualität erreicht. Weiterhin wird die Produktivität durch schnelle Einarbeitung von Teammitgliedern optimiert und die Projekt- und Codegenerierung vermeidet Fehler. Somit können sich die Entwickler voll auf die Umsetzung LINKS [1] Web Client Software Factory Community www.codeplex.com/websf/ implementiert [2] Enterprise Library Community www.codeplex.com/entlib/ [3] Guidance Automation Extensions and Guidance Automation Toolkit http://msdn2.microsoft.com/en-us/ teamsystem/aa718949.aspx [4] Guidance Bundles http://www.codeplex.com/websf/wiki/ View.aspx?title=bundles&referringTitle=Home [5] Blog Michael Puleio http://blogs.msdn.com/mpuleio/ 45
Tabelle 1 Bei Verwendung des CWAB müssen folgende zwei Assemblies kopiert werden: Microsoft.Practices.CompositeWeb.dll Microsoft.Practices.ObjectBuilder.dll Bei Verwendung der Enterprise Library (wenn Sie eines der Guidance Packages verwendet haben), sind folgende Assemblies betroffen: Microsoft.Practices.CompositeWeb.EnterpriseLibrary.dll Microsoft.Practices.EnterpriseLibrary.Common.dll Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.dll Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.dll Microsoft.Practices.EnterpriseLibrary.Logging.dll Microsoft.Practices.EnterpriseLibrary.Security.dll Abbildung 9 Deployment Guide der geschäftsspezifischen Anforderungen und Regeln konzentrieren. Die WCSF zielt hierbei auf mittlere bis große Applikationen ab und unterstützt die unabhängige, modularisierte Entwicklung im Team. Durch die konsequente Einhaltung des MVP Patters erhöht sich die Testbarkeit der Businesslogik. Erwähnenswert bleibt die nahtlose und hilfeunterstützte Integration in Visual Studio 2008 dank des Guidance Toolkits sowie die Erweiterbarkeit durch die Community. Fazit: Selbst ausprobieren! Listing 4:Ergänzungen aus Default.aspx.cs zur Implementation des IDefaultView aus Listing 1 public event EventHandler UpdateNowClicked; public void UpdateNowTextBox(string currenttime) CurrentTimeBox.Text = currenttime; void OnUpdateNowClicked(EventArgs e) if (UpdateNowClicked!= null) UpdateNowClicked(this, e); protected void GetTimeButton_Click(object sender, EventArgs e) OnUpdateNowClicked(e); Tobias Müller arbeitet als Consultant bei der Trivadis AG. Als Entwickler für Microsoft-Technologien liegen seine Schwerpunkte zurzeit in der Architektur und Umsetzung von Frameworks und Referenzanwendungen. Sie erreichen ihn unter tobias.mueller@trivadis.com. 46