Migration von bestehenden .NET Applikationen mit WindowsForms in Misch-Windows/Web-Lösungen Technischer Bericht Marc Schanne ZfS Karlsruhe April 2006 Anforderungsszenario Web-Applikationen sind ein weit verbreitetes Verfahren, um den Zugriff auf Unternehmensprozesse und zentrale Geschäftslogik zu vereinfachen. Da der doppelte Programmieraufwand für das Angebot einer solchen Lösung nicht erwünscht ist und bestehende WindowsLösungen oft um den Einsatz mit Web-Technologie erweitert werden müssen, analysiert dieses Papier Möglichkeiten, die sich durch den Einsatz der .NET-Plattform ergeben. Grundlage der Überlegungen ist eine bestehende .NET Applikation, die eine Trennung in Modell, Geschäftslogik und WindowsForms-GUI zur effizienten Darstellung von Ausschnitten großer Datenmengen implementiert. Diese soll um eine Web-Sicht und eine Darstellung über Web-Browser erweitert werden. Dabei soll die existierende Geschäftslogik ohne Portierungsaufwand adaptiert werden und von beiden Sichten (WindowsForms und WebForms) der Applikation genutzt werden. Dieser Bericht untersucht, in wie weit eine Umstellung der bestehenden Systemarchitektur sinnvoll oder notwendig ist, um auch die Wartung und Erweiterbarkeit der Applikation in der Zukunft zu vereinfachen. Möglichkeiten Vor der Beschreibung der geeigneten Systemarchitektur werden zuerst mögliche Alternativen für die Entwicklung einer Applikationsarchitektur mit Zielrichtung einer zeitnahen Umsetzung bei geringem Aufwand diskutiert. • WebForms mit ASP.NET 2.0 Vorteile in Entwicklung und Wiederverwendung bei .NET 2.0 durch Trennung von GUI (erzeugt mit Visual Studio 2005 Designer, vgl. Abb. 1) und Geschäftslogik im „code behind“ (mit partiellen Abbildung 1: Entwicklung einer Website mit Visual Studio 2005 Klassen) Mit ASP.NET ist es einfach möglich, sauber und klar strukturierte Anwendungen zu erzeugen, bei denen Dartellungsaspekte (GUI) und Geschäftslogik („code behind“) getrennt entworfen und ausgetauscht werden können. Wie bei WindowsForms-Anwendungen, werden die Funktionen der Geschäftslogik (Web-Services, eigene Logik in DLLs, Bibliotheken von Drittanbietern) über Events und Event-Behandler angesteuert, die in entsprechenden ASP-Tags der ASPX-Seite serverseitig definiert werden. Beim Aufruf einer solchen Seite wird der entsprechende Programmtext zur Laufzeit kompiliert, ausgeführt und eine an den jeweiligen Browser angepasste HTML-Seite erzeugt und versendet. • WindowsControl-Hack im IE Lösung insbesondere fürs Intranet um die Nutzung von bestehenden WindowsControls schnell mit einer Browser-Infrastruktur zu ermöglichen Bei diesem Ansatz dient der Internet Explorer als Host für WindowsControls. Ähnlich wie ein Java-Applet kann eine DLL-Datei über einen Object-Tag im HTML-Code referenziert werden. Der Internet Explorer startet dann für eine solche Datei die .NET-Laufzeitumgebung und führt den Code der DLL aus (vgl. Abb. 2). Daher muss im entsprechenden Object-Tag ein voll qualifizierter Klassenname (inkl. Namensraum) angegeben werden. Diese Klasse dient dann als Einstiegspunkt für die Ausführung. Ein wichtiger Punkt bei einer derartigen Lösung ist die Sicherheit. Das WindowsControl wird als vollständig ver- Abbildung 2: Ein UserControl im Internet walteter Code von der .NET-Laufzeit- Explorer umgebung ausgeführt und unterliegt somit den strengen Sicherheitsanforderungen der .NET-Plattform. Die entsprechende DLL muss explizit zur Ausführung berechtigt werden. In einem Intranet-Szenario könnte beispielsweise ein Netzlaufwerk oder auch eine Intranet-URL als Freigabeort verwendet werden. Die sicherste Lösung bietet allerdings die Bindung der Ausführungsberechtigung an einen so genannten „starken Namen“ der die DLL eindeutig beschreibt. • ASP.NET 3.0 und AJAX „Zukunftstechnik“ basierend auf bekannten Techniken (Asynchronem JavaScript, und XML), die Web-Applikationen weiter in Richtung „normale“ Anwendung verändert Mit ASP 3.0 soll der bereits eingeschlagene Weg der Trennung von Darstellung und Geschäftslogik weiter ausgebaut werden. Durch die Möglichkeiten der asynchronen Kommunikation zwischen Server und Webseite beim Client (AJAX) ist es mittlerweile möglich, Komponenten für die Darstellungsschicht zu entwickeln, die denen zustandsbehafteter Anwendungen (WindowsForms) sehr nahe kommen. Beispielsweise ist es so möglich, eine große Tabelle auf mehrere Seiten zu verteilen (paging), beim Blättern der Seiten aber nicht jedes mal den gesamten HTML-Rahmen (mit Bildern und Text, die sich nicht ändern) mit zu übertragen. Es werden nur XML-Daten für die Browser-seitige Füllung des neuen Tabellenausschnitts versendet. ASP.NET in Verbindung mit AJAX erlaubt so den WinForms-ähnlichen komponentenorientierten Entwurf einer Web- Applikation mit Nutzung aller Bibliotheken der .NET-Plattform. Abbildung 3 zeigt mögliche WebControls einer aktuell schon verfügbaren Bibliothek. Zukünftig soll es möglich sein, Komponenten für dynamische TreeView- oder DataGrid-Sichten mit paging auch für ASP.NET als WebControls anzubieten. Funktionalität und Aussehen entspricht weitgehend den in der WinFormsBibliothek verfügbaren Komponenten. So wird es auch möglich, eine Anwendung ohne zusätzlichen Code als WinForms- und WebApplikation anzubieten. • Windows SDK, WinFX und XAML Zukünftige Technik (Vista, „Longhorn“) um basierend auf XML-Beschreibung GUI zu Abbildung 3: WebControls einer kommerziellen beschreiben und sowohl in Windows- als auch Bibliothek mit umfangreichen AJAX-Features Web-Applikationen gleich zu verwenden. Aktuelle CTP unterstützt noch nicht die Konvertierung ohne Entwickler-einsatz. Dieser Ansatz bietet eine weitere Ebene zwischen Darstellungschicht und Geschäftslogik. Ähnlich wie bei ASP.NET 3.0 und AJAX beschrieben, können hier die Komponenten über eine XML-basierte Beschreibungssprache definiert und konkrete Parameter spezifiziert werden. Insbesondere die beiden zuletzt einführten Techniken zeigen auf wohin der Weg bei der Entwicklung von Web-Applikationen mit der Integration von Geschäftslogik und Angleichung der GUI-Möglichkeiten geht. Die Benutzerfühung und -interaktion von Webseitenbasierten Applikationen werden weiterentwickelt und assimilieren das Verhalten lokaler Applikationen. Um jedoch die zeitnahe und dennoch zukunftssichere Erweiterung bestehender Windows-Applikationen umzusetzen, führt dieser Bericht die praktische Entwicklung einer auf ASP.NET 2.0 basierten Web-Applikation und einige grundlegende Entwurfsmuster für diesen Applikationsentwurf ein. Softwareentwurfsmuster in Kombination mit ASP.NET Die durchgängige Integration von ASP.NET in die aktuelle .NET-Plattform 2.0 ermöglicht dem Entwickler die Nutzung der gesamten .NET-Bibliothek sowie den Einsatz der unter .NET verfügbaren objektorientierten Sprachen. Mit dem Einsatz einiger nützlicher OOEntwurfsmuster, wie Einzelstück, 3-Säulen-Architektur und MVC, lässt sich eine Applikationsarchitektur für einfache Erweiterung und Wiederverwendung der Geschäftsprozessund GUI-Logik erreichen. Die folgenden Entwurfsmuster sind grundlegende Erzeugungs- und Architekturmuster und basierend auf diesen und Techniken der ASP.NET-Bibliothek wird eine Softwarearchitekur (vgl. Abb. 4) für das vorgestellte Anforderungsszenario entworfen. • Einzelstück (Singleton) als Manager … zur Verwaltung von Objekten. Durch den Einsatz des Entwurfsmusters Singleton wird garantiert, dass jeweils nur ein Objekt als Manager und als Zugangspunkt zur Geschäftslogik erzeugt wird und von beliebigen Komponenten aus zugegriffen werden kann. Durch die Deklaration des Konstruktors als privat und eine statische, öffentlichen Methode, die den einzelnen Manager zurückliefert, wird ein eindeutiger Zugangspunkt ermöglicht, der von GUI, „code behind“ und zusätzlichen Verwaltungsklassen erreichbar ist. • 3-Säulen/Schichten Architektur … zur Trennung von Präsentations-, Geschäfts- und Datenhaltungslogik. Die Verwendung von Schichten mit klaren Schnittstellen, zur ober- bzw. unterhalb liegenden Schicht erleichtert die Wiederverwendung der einzelnen Komponenten. Die Geschäftsprozesslogik kann so leicht von Windows- und Web-Applikationen gemeinsam verwendet werden. • Model-View-Controller (MVC) … zur logischen Trennung innerhalb einer interaktiven Benutzeroberfläche. Das Datenmodell (M) wird dem Benutzer in verschiedenen Sichten (V) dargestellt. Das Modell benachrichtigt dabei die Sichten über die Veränderungen der darzustellenden Daten. Durch die Trennung von Verarbeitungslogik (C) können Komponenten leichter unabhängig wiederverwendet werden. Abbildung 4: Architekturvorschlag mit ASP.NET 2.0, MVC und Singleton Der in der Abbildung 4 dargestellte Entwurfsvorschlag für eine ASP.NET 2.0 WebApplikation nutzt diese Muster für einen klaren Entwurf. Die Bereiche ASP und „code behind“ stellen Klassen bzw. Webform-Elemente von ASP.NET dar. Durch den Entwurf von Webseiten mit Masterpage-Layout wird ohne „Copy-and-Paste“ ein einheitliches, leicht anpassbares Corporate Design der Web-Applikation ermöglicht. Mit Nutzung des in Visual Studio 2005 integrierten Designers können entsprechende GUIObjekte (ASP) und Verarbeitungslogik im „code behind“ entworfen werden. Die Verbindung mit Klassen (Model4Control-Bereich), die das Modell im MVC-Muster darstellen, wird durch entsprechende Assistenten der Entwicklungsumgebung erleichtert. Für Anwendungslogik und -daten, die „Seiten“-übergreifend in verschiedenen ASP.NET Webforms zur Verfügung stehen müssen, bietet die .NET-Bibliothek und der verwendete Web-Server ein Session-Objekt. Dies ist eine Hash-Datenstruktur, in der unter eindeutigen Namen beliebige Objekte gespeichert und zur Verfügung gestellt werden können. Da nur Objekte der ASP.NET Schichten Zugriff auf dieses Web-Objekt haben, muss für die Integration von Geschäftsprozesslogik-Objekten und für den Zugriff auf eine Datenhaltungsschicht aus Datenbanken oder Klassen mit anderen Persistenzmechanismen (DB/BL-Bereich) ein ähnliches Modell nachgebildet werden (Singleton/HTTP CacheBereich). Mit dem Einsatz von HTTP-Caches können Objekte über ihren Hashkey gespeichert und zugegriffen werden. Der HTTP-Cache bietet ein feingranulares Verwaltungsverfahren. Die Objekte werden ohne direkte Referenz aus dem aktiven Programmcode vor der automatischen Garbage-Collection geschützt. Der Einsatz eines Managers, der als SingletonImplementierung, ermöglicht den Zugriff aus den anderen Klassen. Auch für den Zugriff auf die Geschäftslogik kann sich ein Singleton-Muster eignen, um die Geschäftslogik-Objekte nur einmal zu erzeugen und so den Speicherverbrauch kontrollieren zu können. Die speicherplatzintensive Erzeugung von Objekten in ASP.NET kann so umgangen werden. Entwurf Mit dem Einsatz von Visual Studio 2005 wird der Programmierer beim gesamten Entwicklungsprozess, von Entwurf, über Implementierung bis hin zum Deployment und Testing unterstützt. Dieser Abschnitt greift exemplarischen ein paar Entwicklungsthemen auf und beschreibt knapp die notwendigen Schritte. • Masterpage für einheitliche Seitenstruktur und Corporate Design Mit einer Masterpage kann ein Design (Rahmen) für die gesamte Website und WebApplikation definiert werden. Hier können Position und Erscheinungsbild von Logos oder von Navigationselementen festgelegt werden. Außerdem können Bereiche definiert werden, in denen auf den einzelnen Webseiten individueller Inhalt angezeigt wird. Die Masterpage ist ein Server-Steuerelement, das seine Eigenschaften (Aussehen) ähnlich einer abstrakten Klasse an Seiten, die von ihm abgeleitet sind, vererbt. Wird eine solche Seite (*.aspx) aufgerufen, so wird serverseitig der HTML-Code des Rahmens (Masterpage) in den HTML-Code der eigentlichen Seite eingefügt und das so erzeugte HTML-Dokument browseroptimiert an den Client versendet. Neben dem einheitlichen Erscheinungsbild spart dieses Konzept fehleranfälliges „Copy-and-Paste“ gleich bleibender Inhalte. • Navigation und Benutzerverwaltung Für eine ASP.NET Web-Applikation kann über eine so genannte SiteMap eine baumartige Struktur definiert werden. Diese kann an Navigationselemente, wie eine Baum- oder Tabellen-Navigation gebunden werden. Abhängig vom Web-Browser wird das ServerObjekt als DHTML-Inhalt dargestellt und die grafische Darstellung wird über CSSBeschreibungen in Visual Studio gesteuert. Wie bei allen Steuerelementen von ASP.NET, wird über diese Trennung von Inhalt (SiteMap) und Design (Steuerelement zur Navigation) ein sauberer Entwurf gewährleistet. Die geschaffene Abstraktionsebene ermöglicht es, die Navigation von der Ordnerstruktur der Website zu trennen. Zugangsund Sicherheitsebenen sind bei ASP.NET ordnerbasiert und hierarchisch aufgebaut und die Ebene der SiteMap erlauben eine Navigation unabhängig davon zu gestalten. Ob dies sinnvoll ist, oder eher einen Be-nutzer verwirrt, sei dahingestellt. • Website- und Rollenverwaltung über Verzeichnisse Die Rollenverwaltung von ASP.NET 2.0 dient zum Verwalten der Autorisierung für bestimmte Bereiche der Web-Applikation. Mit einer Rollenverwaltung können Benutzer in Gruppen eingeteilt werden, indem jedem Benutzer eine Rolle zuteilt wird (Manager, Vertrieb, User, usw.). Nach dem Anlegen der verschiedene Rollen können Zugriffsregeln erstellt werden. Es ist möglich, Rollen den Zugriff auf bestimmte Seiten zu verweigern, oder bestimmte Inhalte einer einzelnen Seite vor bestimmte Rollen zu verbergen. Benutzer können mehrere Rollen gleichzeitig besitzen. Beispielsweise macht es in einem Diskussionsforum Sinn, dass einigen Benutzern sowohl der Rolle eines Mitglieds als auch der Rolle eines Moderators zugeordnet sind. Jede Rolle kann über unterschiedliche Berechtigungen verfügen. Ein Benutzer, der zwei Rollen zugeordnet ist, hätte dann die Berechtigungen beider Rollen. Für die zur Benutzerverwaltung notwendigen Funktionen (Login, Registrierung, Anzahl angemeldeter Benutzer, usw.) gibt es fertige Steuerelemente (UserControls), die einfach in die eigene Seite integriert werden können, ohne dass dazu eigener Programmcode notwendig ist. • Datenbankzugriff Die Verwendung der Microsoft-eignen Datenbank SQL Server 2005 (Express) ist tief in die Entwicklungsumgebung Visual Studio 2005 (Express) und die Komponenten des .NET Plattforms integriert. Es gibt Steuerelemente zum Anzeigen von Daten (z.B. GridView), die einfach an Tabellen der Datenbank gebunden werden können. Die Daten können dann webbasiert verwaltet werden. Es ist möglich, Funktionen wie das Ändern von Daten, Paging großer Datenmengen oder Deitailansichten bestimmter Datensätze ohne eigenen Programmcode zu realisieren. Details des Datenbankzugriffs wie SQL, Transaktionen oder Caching von Daten werden dabei durch die Steuerelemente der .NET Plattform verborgen. Erfahrungen beim Einsatz von ASP.NET 2.0 Mit ASP.NET ist es möglich, schnell und einfach eine schicke und ordentlich strukturierte Web-Applikation zu erstellen. Viele Standardaufgaben (Datenbankzugriffe, Benutzerverwaltung, einheitliches Layout) werden durch Komponenten des .NET-Plattforms zur Verfügung gestellt und können ohne programmatischen Aufwand individuell angepasst werden. Damit diese Vorteile auch wirklich gewinnbringend eingesetzt werden können, ist es jedoch erforderlich, sich mit dem .NET-Plattform und seinen Möglichkeiten auseinander zu setzen. Viele Dinge (Sicherheitsaspekte, mehrsprachige Unterstützung) sind auf eine bestimmte Art und Weise umgesetzt und müssen so daher in das Seitenkonzept integriert werden. Wenn aber bestimmte Erfordernisse (z.B. hierarchische Ordnerstruktur für Zugriffsebenen, Verwendung einer unterstützten Datenbank) berücksichtigt werden, beschränkt sich die Schwierigkeit bei der Erstellung einer Website auf die Auswahl und die Anpassung der richtigen Komponenten. Ein wesentlicher Vorteil der Entwicklung mit ASP.NET ist die klare Strukturierung von Design und Geschäftslogik, die bei der Entwicklung durch die Trennung des „code behind“ und der ASPX-Seite vorgegeben ist. Änderungen und Pflege der Website sind so besonders unkompliziert, da sowohl die darstellenden Komponenten (WebControls), als auch die Geschäftslogik komponentenbasiert aufgebaut sind. So können die fraglichen Teile einfach ohne viele Seiteneffekte ausgetauscht werden. Durch den Einsatz bekannter OO-Entwurfsmuster kann diese Architektur weiter unterstützt werden. So wird es möglich auf Basis des zustandslosen Web-Protokolls (HTTP) die unter Windows gewohnte Benutzerführung nachzubilden und die Wiederverwendung von Geschäftsprozesslogik auszubauen.