Migration von WPF-Desktop Anwendungen zu Single Page Web-Apps
Die Migration von Desktop-Anwendungen zu nativen Web-Apps wird immer wichtiger, da Unternehmen zunehmend auf umfassende Erreichbarkeit und Plattformunabhängigkeit setzen. Viele Desktop-Applikationen wurden mit dem Grafik-Framework Windows Presentation Foundation für das Betriebssystem Windows erstellt. Eine effiziente Art der Migration für diese Art von Anwendungen beschreibt dieser Artikel.
Eine bekannte und sehr häufig eingesetzte Technologie für Windows Desktop-Applikationen ist das Grafik-Framework Windows Presentation Foundation (WPF). WPF basiert auf den folgenden technischen Eigenschaften:
- XAML (Extensible Application Markup Language): Es wird eine XML-basierte Sprache eingesetzt, um das Layout und das Design der Benutzeroberfläche zu definieren. XAML trennt das UI-Design von der Geschäftslogik, was Entwicklung und Wartung vereinfacht und eine klare Trennung der Zuständigkeiten ermöglicht.
- Datenbindung (Data Binding): Ein mächtiges Feature ist die Datenbindung, welche UI-Elemente direkt an Datenquellen koppelt. Änderungen an den Datenquellen reflektieren sich automatisch im UI und umgekehrt.
- Grafik- und Rendering-Engine: WPF nutzt DirectX als Grafikengine. Diese ermöglicht die Darstellung von Vektorgrafiken, 3D-Grafiken und komplexen Animationen. Dadurch sind die Anwendungen nicht nur optisch ansprechend, sondern auch skalierbar auf verschiedenen Bildschirmauflösungen.
- Styling und Theming: WPF bietet umfangreiche Unterstützung für Styling und Theming, d.h. das Design kann durch Styles und Control Templates vollständig angepasst werden.
- UI-Controls und Layout: WPF stellt eine breite Palette von vordefinierten UI-Controls und komplexen Containern wie Grids, Panels und Canvas bereit, die für flexible Layouts verwendet werden können. Diese UI-Controls können durch Erweiterungen und Anpassungen für spezielle Anforderungen modifiziert werden.
- Befehlsstruktur (Commands): WPF unterstützt eine Befehlsstruktur, welche die Logik von der Benutzeroberfläche entkoppelt.
Diese technischen Merkmale machen WPF zu einer mächtigen Plattform für die Entwicklung von betrieblichen Desktop-Anwendungen unter Windows. Die erstellten Anwendungen sind vielfältig weiter im Einsatz und haben sich etabliert.
Modernisierungsdruck
Viele Unternehmen stehen vor der Herausforderung, bestehende Desktop-Anwendungen in Web-Applikationen zu transformieren. Web-Anwendungen bieten eine Reihe von Vorteilen. Die wichtigsten Merkmale sind: plattformunabhängige Ausführung im Browser des jeweiligen Systems; keine Notwendigkeit einer lokalen Installation, stattdessen zentrale Einrichtung; Wartung und Pflege auf einem zentralen Serverstandort, ggf. auch mit Hilfe eines Cloud-Dienstes; unmittelbare Mehrbenutzerfähigkeit und geringere Ansprüche an die Hardware des Clients.
Für einen Wechsel der technologischen Basis der Software gibt es grundsätzlich mehrere Ansätze:
- Neuentwicklung: Dieser Weg ist meistens zeitaufwendig, kostenintensiv und in der Umsetzung risikoreich. Die damit verbundenen Kosten sind i.d.R. deutlich höher als die von Migrationsprojekten.
- Nutzung von Standardsoftware: Dieses Vorgehen ist immer dann empfehlenswert, wenn die Geschäftsprozesse mit geringen Anpassungen durch Standardsoftware abgedeckt werden können.
- Softwaremigration: Hierunter versteht man einen Prozess der Umstellung von einer bisherigen zu einer neuen technologischen Umgebung. Die Migration geht über eine einfache Aktualisierung bzw. ein Upgrade hinaus und bezeichnet einen grundlegenden Wechsel der Software-Infrastruktur. Für eine erfolgreiche Migration ist eine strategische Planung notwendig. Im Idealfall stehen Werkzeuge zur Verfügung, welche die Umstellung unterstützen bzw. teilweise oder ganz automatisieren.
Technologisch unterscheiden sich Desktop- und Web-Applikationen grundlegend. Letztere basieren auf einer client- und einer serverseitigen Ausführungsschicht. Auf Seiten des Clients kommen dabei HTML (Struktur), CSS (Design) und JavaScript (Interaktion) zum Einsatz. Typisch sind sogenannte Single Page Applikationen (SPA), welche durch ein intelligentes Konzept von Datenaustausch und Aktualisierung der Darstellung für eine hohe Reaktionsfähigkeit der Anwendungen sorgen.
Technische Softwaremigration von WPF-Anwendungen
Das Ziel ist eine umfassende werkzeugunterstützte Softwaremigration von WPF-Anwendungen zu Web-Applikationen. In diesem Abschnitt skizzieren wir das mögliche Vorgehen. Zum Einsatz kommt das Framework Wisej.NET [1]. Es ist hilfreich, sich den typischen Aufbau (Architektur) einer WPF-Applikation anzusehen. Von Microsoft empfohlen und vielfältig in der Praxis eingesetzt ist das Model View ViewModel (MVVM)-Pattern. Die Nutzung des MVVM-Patterns sorgt für eine klare Trennung zwischen der Darstellung einer Benutzeroberfläche (UI) und der Logik der Benutzerinteraktion, welche die Daten manipuliert. Dies wird erreicht, indem die UI-Entwicklung (View) von der Geschäftslogik (Model) durch das ViewModel entkoppelt wird (Abb. 1).
Model
Das Model repräsentiert die Daten und die Geschäftslogik der Anwendung. Es ist verantwortlich für den Zugriff auf die Datenquelle (z.B. Datenbanken, Web-Services) und deren Manipulation. Das Model enthält keine Informationen über die Benutzeroberfläche und interagiert nicht direkt mit der View. Es kann jedoch Benachrichtigungen über Datenänderungen senden, meist durch Implementierung von Patterns wie Observer.
View
Die View ist die Benutzeroberfläche der Anwendung. Diese enthält die UI-Elemente (z.B. TextBox, Button, Label, DataGrid), welche die Daten anzeigen und mit denen der Benutzer interagiert. Die View ist ausschließlich für die Darstellung der Benutzeroberfläche zuständig und sollte keine direkten Datenmanipulationen oder Geschäftslogik enthalten. Es erfolgt eine Interaktion mit dem ViewModel, um Daten darzustellen oder Benutzereingaben weiterzuleiten. Typischerweise verwendet die View Datenbindung (Data Binding), um sich mit dem ViewModel zu synchronisieren und automatisch aktualisiert zu werden, wenn sich Daten im ViewModel ändern.
ViewModel
Das ViewModel ist eine Abstraktion der View und fungiert als Bindeglied zwischen dem Model und der View. Es empfängt Daten vom Model, die es verarbeitet, so dass diese einfach von der View dargestellt werden können. Das ViewModel beinhaltet die Präsentationslogik, die benötigt wird, um die Elemente der View zu steuern, aber es weiß nichts über die spezifischen Details der Views, was bedeutet, dass es keine direkte Referenz auf die UI-Komponenten hat. Es nutzt Konzepte wie Befehle (Commands) und Datenbindung, um Aktionen auszulösen, die von der UI initiiert werden und um Änderungen in der View zu reflektieren.
Bei der Softwaremigration einer WPF-Anwendung zu einer Web-Applikation sollten diese Anwendungsschichten grundsätzlich erhalten bleiben. Dazu kommt das Web-Framework Wisej.NET [2] zum Einsatz. Es ist .NET basiert und bietet eine umfangreiche Unterstützung für die Umsetzung von Rich Internet Applications, die sich durch eine desktopähnliche Benutzererfahrung auszeichnen. Wisej.NET kommt mit einer umfassenden Bibliothek von vordefinierten Steuerelementen, die speziell für die Anforderungen von Unternehmensanwendungen entwickelt wurden. Das UI wird komplett im Designer von Visual Studio erstellt. Die ursprüngliche Anwendungslogik der .NET-Applikation (in diesem Fall einer WPF-Anwendung) wird vom Client auf den Server verlagert. Auf der Serverseite werden die .NET Steuerelemente verwendet. Wisej.NET-Widgets bilden die serverseitigen verwendeten Komponenten für das User Interface eins zu eins im Browser ab. Es handelt sich um JavaScript-Klassen auf der Grundlage der Bibliothek qooxdoo [3], welche durch Wisej.NET erweitert werden. Das User Interface wird durch das entsprechende JavaScript-Widget gerendert. Für eine hohe Reaktionsfähigkeit sorgt ein optimierter Datenaustausch zwischen Client und Server. Dazu wird das SPA-Konzept realisiert, eine HTML-Seite wird geladen und dann werden die einzelnen Objekte manipuliert, um einen geänderten Anwendungsinhalt anzuzeigen. Dies geschieht optimiert mit Hilfe der Fast-DOM Technik. Im Übrigen können sowohl Anwendungen mit dem klassischen .NET-Framework (bis Version .NET-Framework 4.8) als auch mit Applikationen auf der Basis von .NET (ehemals .NET Core) für die Migration verwendet werden.
Während Wisej.NET eine nahezu automatisierte Migration von WinForms-Anwendungen ermöglicht, ist bei der Migration von WPF-Anwendungen etwas mehr Aufwand notwendig. Wisej.NET bildet die Standard UI-Controls von WinForms nahezu 1:1 als JavaScript-Controls nach. Eigenschaften, Verhalten und Events sind dabei identisch. Daher ist der Migrationsaufwand hier stark reduziert. Bei WPF-Anwendungen wird das UI deklarativ mittels XAML-Code erstellt. Es ist daher für die Migration zur Web-Applikation neu zu erstellen. Für jedes UI-Control aus der WPF-Anwendung ist eine adäquate Alternative in Form eines Wisej.NET-Controls zu ermitteln. Das Erstellen der Benutzeroberfläche wird dabei durch den Einsatz des grafischen Designers in Visual Studio erleichtert, d.h. das gesamte UI kann intuitiv erstellt werden.
Wisej.NET bietet für jedes Element eine Möglichkeit der Datenbindung. Diese Funktion wird genutzt, um die Architektur der bestehenden WPF-Applikation auf der Basis des MVVM-Konzeptes beizubehalten. Dazu wird die Implementierung der Datenbindung von XAML-Code (View) in den C#-Code (View) der neuen Applikation verschoben. Die anderen Schichten der Anwendung, d.h. die ViewModel- und Model-Dateien können unverändert übernommen werden. Tabelle 1 listet die notwendigen Maßnahmen bei der Migration einer WPF-Anwendung zu einer Wisej.NET basierten Web-Applikation im Detail auf.
Tabelle 1: Anpassungsschritte bei der Migration einer WPF-Anwendung zu einer Web-Applikation.
Schicht | Funktion | WPF-Anwendung | Wisej.NET basierte Web-Applikation | geschätzter Aufwand |
View (User Interface) | Layout und UI-Elemente | Realisierung in XAML (deklarativ) mit Hilfe von WPF- spezifischen UI-Controls (Standard, Drittanbieter) und Layout-Containern | Umsetzung des User Interfaces mit Hilfe der UI-Komponenten von Wisej.NET; manuelle Auswahl; Layout und UI-Gestaltung kann mit Hilfe des grafischen Designers und von Layout-Containern vorgenommen werden | mittel, je nach Umfang und Komplexität des UI |
Datenbindung | Datenbindungen werden in XAML-Code definiert, es erfolgt Bindung der Eigenschaften der UI-Controls an das ViewModel | Datenbindungen werden in C#-Code in der Code-Behind-Datei implementiert; Eigenschaften der UI-Controls werden weiterhin an ViewModel gebunden | mittel, je nach Umfang und Komplexität des UI | |
Commands | Weiterleitung der Interaktionen des Benutzers („Klick auf einen Button“) an das ViewModel durch Bindung der Command-Eigen- schaft | Commands aus dem ViewModel werden im C#-Code der Code-Behind-Datei gebunden | gering bis mittel | |
ViewModel | Datenaustausch mit View, Entgegennahme der Interaktionen des Benutzers über Commands | Implementierung in C# | unveränderte Übernahme der ViewModel-Dateien | gering |
Model | Datenaustausch zwischen ViewModel und Datenmodell der Anwendung | Implementierung in C# | unveränderte Übernahme der ViewModel-Dateien | gering |
Die Darstellung zeigt, dass der Anpassungsbedarf sich hier auf die Neugestaltung des User Interfaces konzentriert. Das MVVM-Konzept kann weiter ohne größere Anpassungen verwendet werden, dazu sind die Datenbindungen von Eigenschaften und Commands aus den XAML-Dateien der WPF-Applikation in C# der Web-Applikation zu implementieren.
Ein Beispiel
Anhand eines einfachen Beispiels wird die Vorgehensweise demonstriert. Ausgangspunkt ist die übliche Situation in einer WPF-Applikation. Das User Interface wurde mittels XAML-Code und einem grafischen Designer in Visual Studio erstellt (Abb. 2).
Es lassen sich die typischen Merkmale einer solchen WPF-Applikation ausmachen:
- Die Steuerelemente – hier beispielhaft ein DataGrid-Control – werden mittels Datenbindung über die Eigenschaft DataContext an das ViewModel der Applikation gebunden. Im XAML Code sieht das wie folgt aus:
<DataGrid ItemsSource="{Binding Path=Persons,
Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}"…/>
- Die Applikationslogik wird in die Schichten View, ViewModel und Model aufgeteilt.
- Das Model repräsentiert die Datenklassen, beispielsweise die Klasse Person:
public class Person
{
public int Id { get; set; }
public string Name { get; set;}
public string FirstName { get; set;}
}
Das ViewModel vermittelt die Daten zwischen dem UI (View) und der Datenhaltungsschicht (Model):
public partial class PersonViewModel:ObservableObject
{
private ObservableCollection<Person> persons;
public RelayCommand AddItem { get; set; }
public ObservableCollection<Person> Persons
{
get
{
return persons;
}
set
{
persons = value;
OnPropertyChanged("Persons");
}
}
public PersonViewModel()
{
AddItem = new RelayCommand(AddItemCommandExecute);
…
}
private void AddItemCommandExecute()
{
Person p = new Person() { Id=persons.Count, FirstName = "Ben",
Name = "Müller" };
Persons.Add(p);
}
- Das ViewModel implementiert die Schnittstelle INotifyPropertyChanged, welche dafür sorgt, dass Daten zwischen den Elementen der View und dem ViewModel auf dem Wege der Datenbindung automatisch synchronisiert werden. Für die Datenliste (Persons) wird ebenfalls ein Datentyp verwendet (ObservableCollection), welche Änderungen des Listeninhalts an die View automatisch weitergeben.
- Aktionen des Benutzers, beispielsweise ein Klick auf einen Button, werden mittels Commands von der View an das ViewModel zur Verarbeitung weitergereicht:
<Button
…
Command="{Binding Path=AddItem}"/>
Dieser Aufbau findet sich in vielen WPF-Applikationen in ähnlicher Form. Das Ziel ist es, bei der Migration weitgehende Teile der Architektur zu erhalten und möglichst große Teile des Quellcodes zu übernehmen. Die neu zu erstellende Anwendung wird auf der Basis des Frameworks Wisej.NET erstellt. Die Klassen für ViewModel (PersonViewModel) und Model (Person) werden unverändert übernommen. Das User Interface wird mit den UI-Controls von Wisej.NET aufgebaut und dabei wird der grafische Designer von Visual Studio genutzt (Bild 3).
Die Migration basiert auf den folgenden Merkmalen bzw. Schritten:
- Das neu gestaltete UI verwendet die modernen UI-Controls, beispielsweise ein DataGrid. Diese UI-Controls sind JavaScript-Controls, welche über CSS an moderne Themen (Theming) angepasst werden. Dazu kann man beispielsweise die Themen Bootstrap oder Material Design wählen und auf diese Weise die gesamte Applikation mit einem frischen Look & Feel versehen.
- Wisej.NET bietet unterschiedliche Layout-Container, welche eine einfache responsive Gestaltung der Web-App ermöglichen. Das sorgt für eine korrekte Darstellung auf unterschiedlichen Bildschirmgrößen und -auflösungen.
- Die Datenbindung erfolgt in der Web-App auf einfache Art und Weise in den Code-Behind-Dateien. Hier werden die betreffenden Eigenschaften der UI-Elemente an die Eigenschaften des ViewModels gebunden. Für die Collection-Eigenschaft des Beispiels sieht das wie folgt aus:
dataGridView1.DataSource = viewModel.Persons;
Es wird die DataSource-Eigenschaft des DataGrid-Controls an die Eigenschaft Persons (Datentyp: ObservableCollection<Person>) im ViewModel gebunden. Damit werden die Daten zwischen dem ViewModel und der View (UI, DataGrid) synchronisiert.
- Im ViewModel werden für die Benutzerinteraktionen die Commands modifiziert. In der ursprünglichen WPF-Version der Anwendung gab es beispielsweise den folgenden typischen Quellcode für ein Command, welcher ein Objekt der Klasse Person zur Liste der Personen (Persons) ergänzt:
// Command definieren
public RelayCommand AddItem { get; set; }
// Command im Konstruktor der Klasse initialisieren
public PersonViewModel()
{
AddItem = new RelayCommand(AddItemCommandExecute);
…
}
// Execute-Methode (ausführbare Methode) des Commands
private void AddItemCommandExecute()
{
Person p = new Person() { Id=persons.Count, FirstName = "Ben", Name = "Müller" };
Persons.Add(p);
}
Die Klasse RelayCommand stammt dabei beispielsweise aus einem Framework zur einfachen Umsetzung des MVVM-Patterns oder ist in einer selbst erstellten Basisklasse definiert. Diese Basisklasse stellt die Funktionalität für ein Command zur Verfügung. Dieser Quellcode muss nur minimal für die Web-Version angepasst werden:
// Command definieren
public Command AddItemCommand { get; set; }
// Command initialisieren und Ausführungsmethode zuweisen
AddItemCommand = new Command(
execute: args =>
{
Person p = new Person() { Id = persons.Count, FirstName = "Ben", Name = "Müller" };
Persons.Add(p);
});
Die neue Basisklasse Command stammt aus dem Framework Wisej.NET und sorgt dafür, dass die Eigenschaften der Web-Komponenten an den Quellcode gebunden werden können. Das bestehende Command aus der WPF-Applikation muss also lediglich in Bezug auf den Datentyp angepasst werden. Weitere Änderungen sind nicht notwendig.
Mit Hilfe dieser geringen Anpassungen im Quellcode und der Gestaltung des User Interfaces kann eine Desktop-Applikation auf der Basis des Grafik-Frameworks Windows Presentation Foundation technisch zu einer modernen Web-Applikation migriert werden. Die Funktionen der Anwendung bleiben erhalten. Im nächsten Schritt können weitere Anpassungen und Modernisierungen der Applikation vorgenommen werden.
Weitere Anpassungen bei der Softwaremigration
Nach der technischen Migration des Quellcodes sind i.d.R. weitere Maßnahmen notwendig. Umfang und Aufwand werden durch den Wunsch nach Funktions- und Designanpassungen und den notwendigen Änderungen durch den Wechsel des Applikationstyps (Desktop zu Web) bestimmt. Zu diesen Aufgaben zählen beispielsweise:
- Anpassungen und Erweiterungen der Funktionalität der Applikation, welche beispielsweise in der Geschäftslogik vorgenommen werden
- Beseitigung von Fehlern, die durch die automatische Migration übernommen wurden
- Änderungen in der Ansteuerung von lokaler Hardware
- Anpassungen durch einen möglichen Wechsel von einem Ein- zu einem Mehrbenutzerbetrieb.
Diese Aufgaben sind beispielhaft und jeweils projektspezifisch zu identifizieren und umzusetzen.
Fazit
Windows Desktop-Anwendungen wurden sehr häufig auf der Basis des .NET-Frameworks und der Grafikschnittstellen WinForms bzw. WPF erstellt. Beide Technologien sind geeignet um diese mit Hilfe des Web-Frameworks Wisej.NET zu einer modernen Single Page Web-App zu migrieren. Die Migration von WPF-Anwendungen gelingt ebenfalls mit einem überschaubaren Aufwand, da das üblicherweise in den Anwendungen genutzte MVVM-Architekturmuster beibehalten werden kann. Die View muss mit Hilfe des grafischen Designers und UI-Komponenten neu erstellt werden. Die anderen Applikationsschichten (ViewModel, Model) können unverändert übernommen werden. Datenbindungen und Commands werden auch durch die Wisej.NET-Komponenten unterstützt, so dass die Applikationsstruktur beibehalten werden kann und sich der Aufwand gegenüber einer Neuentwicklung deutlich reduziert.
Hinweis: Der Quellcode zum Beispiel kann von [4] heruntergeladen werden. Es wird das Prinzip der technischen Migration von einer WPF- zu einer Web-App (mittels Wisej.NET) demonstriert.