Visual Studio 2012

Bringen Sie Ihre Daten mit Visual Studio LightSwitch 2012 in Form

Jan Van der Haegen

 

Visual Studio LightSwitch wurde ursprünglich Mitte 2011 als einfachstes Mittel zum Erstellen von Geschäftsanwendungen für den Desktop oder die Cloud auf den Markt gebracht. Auch wenn es bald von vielen IT-Interessierten angenommen wurde, kamen einige professionelle Entwickler schnell zu dem Schluss, dass LightSwitch vielleicht doch noch nicht für die Unternehmenswelt bereit ist. Eine schnelle Anwendungsentwicklungstechnologie kann eine großartige Möglichkeit bieten, heute mit der Entwicklung neuer und kleiner Anwendungen zu beginnen. Es hat sich jedoch leider gezeigt, dass diese schnell erstellten Anwendungen einige Nachteile haben. Sie können nicht leicht angepasst werden, sobald sie eine gewisse Größe erreicht haben. Zudem ist es sehr aufwendig, sie in vorhandene Legacysysteme zu integrieren, sie können nicht an schnelle technologische Änderungen angepasst werden, und es bestehen Probleme bei der Erfüllung von Unternehmensanforderungen wie mandantenfähigen Installationen oder der Mehrbenutzerfähigkeit. Wer möchte außerdem in einer Welt der offenen Standards wie RESTful-Dienste und HTML-Clients, die von fast allen großen IT-Organisationen übernommen werden, durch ein geschlossenes Format eingeschränkt werden?

Angesichts der bevorstehenden Veröffentlichung von LightSwitch 2012 hielt ich dies für einen passenden Zeitpunkt, einige Bekannte (professionelle Entwickler und Softwarearchitekten) davon zu überzeugen, ihre Vorurteile abzulegen und die Fähigkeit von LightSwitch, moderne Anforderungen zu erfüllen, erneut zu bewerten.

Das Ergebnis? Es hat sich herausgestellt, dass LightSwitch 2012 nicht nur mit allen diesen Anforderungen umgehen kann, sondern sie sogar in allen Punkten perfekt erfüllte.

Grundlagen von Visual Studio LightSwitch

LightSwitch ist eine entwurfsbasierte Ergänzung für Visual Studio 2012 zur Unterstützung der Arbeit mit datenzentrierten Diensten und Anwendungen. Die Visual Studio-IDE wird beim Arbeiten in einem LightSwitch-Projekt in eine Entwicklungsumgebung mit nur drei Haupt-Editoren umgewandelt (im sogenannten „logischen Modus“): Entity Designer, Abfrage-Designer und Bildschirm-Designer. Bei diesen Editoren steht das schnelle Erzielen von Ergebnissen durch eine äußerst intuitive, schnelle und benutzerfreundliche Anwendung im Mittelpunkt. Hiervon profitiert ein LightSwitch-Entwickler gleich in mehrerer Hinsicht:

  • Erstens wird grundlegende Arbeit vermieden (sich wiederholender Code, der normalerweise mit der Entwicklung dieser Informationssysteme einhergeht). Einfach verwendbare Editoren bedeuten eine schnelle Entwicklung. Eine schnellere Entwicklung führt wiederum zu produktiven Entwicklern. Und produktive Entwickler bedeuten einen Mehrwert für das Geschäft. Scott Hanselman würde es folgendermaßen ausdrücken: „Etwas wirklich Großes wird skaliert, indem Sie so wenig wie möglich und so viel, wie Sie können, tun. Je weniger Sie von einer Sache tun, desto mehr davon können Sie tun.“ (Siehe bit.ly/InQC2b.)
  • Zweitens, und dies ist vielleicht am wichtigsten, können Personen ohne technische Fachkenntnisse, von Business Analysten und Besitzern von Kleinunternehmen bis hin zu „Entwicklern“ für Microsoft Access oder Microsoft Excel (häufig auch als „Citizen Delevopers“ oder als „User-Entwickler“ bezeichnet), die sich sehr gut auskennen, beim Entwickeln der Anwendung helfen oder die gesamte Anwendung sogar alleine entwickeln. In den Editoren können bestimmte technische Optionen auf Wunsch ausgeblendet werden. Die Anwendungs-Designer werden im Hintergrund dahin geführt, bewährte Methoden wie die folgenden anzuwenden: Kapseln der Domänenlogik in wiederverwendbaren Domänenmodellen, Erhalten der Reaktionsfähigkeit der Benutzeroberfläche durch Ausführen von Geschäftslogik in einem anderen Thread als dem UI-Thread oder Anwendung von Model-View-ViewModel-(MVVM-)Entwicklungsmustern in den Clients.
  • Außerdem werden die Klassen in diesen Editoren nicht direkt bearbeitet. Stattdessen werden sie in XML-Dateien mit Metadaten ausgeführt (LightSwitch Markup Language), die dann von benutzerdefinierten MSBuild-Aufgaben zum Erzeugen von Code während der Kompilierung verwendet werden. Hierdurch wird die Investition in die Geschäftslogik von allen technologischen Optionen effektiv befreit. Beispielsweise hat ein LightSwitch-Projekt, das in Version 1.0 erstellt wurde, WCF RIA-Dienste für die gesamte Kommunikation zwischen Client und Server verwendet. In demselben Projekt wird heute stattdessen bei der Kompilierung ein Open Data Protocol-(OData-)Dienst verwendet (unten mehr zu OData). Noch anpassungsfähiger an die sich stetig ändernde IT-Landschaft kann eine Anwendung nicht sein.

Entwerfen von Daten

Das Entwerfen von Daten mit LightSwitch entspricht in der Sprache professioneller Entwickler dem Erstellen von Domänenmodellen. Sie werden zuerst über das „Starten mit Daten“ befragt, insbesondere danach, wo Sie die Daten speichern möchten. Darauf gibt es zwei mögliche Antworten. Sie können eine neue Tabelle erstellen. In diesem Fall werden die erforderlichen Tabellen mit Entity Framework in SQL Compact (beim Debuggen der Anwendung), SQL Server oder in der Windows Azure SQL-Datenbank erstellt. Alternativ können Sie Ihre Entitäten über eine vorhandene Datenquelle entwerfen, wie SharePoint, einen OData-Dienst, eine vorhandene Datenbank oder eine Assembly für WCF RIA-Dienste. Mithilfe der beiden letzten Optionen können Sie tatsächlich weiterhin an einem vorhandenen Datensatz aus einer älteren Anwendung arbeiten, den Datensatz aber mit einem vollkommen neuen Dienst oder einer ganz neuen Anwendung über moderne und offene Standards bereitstellen.

Nehmen Sie als Beispiel einen vorhandenen OData-Dienst (eine ausführliche Liste mit Beispielen finden Sie unter odata.org/ecosystem), und importieren Sie eine oder mehrere Entitäten in eine neue LightSwitch-Anwendung.

Abbildung 1 zeigt, wie die Entität „Employee“ aus der Datenquelle „Northwind“ zuerst in Entity Designer dargestellt wird. Sie können die Entität auf verschiedene Weise mit ein paar Klicks und bei Bedarf minimalem Programmieren neu entwerfen (das Resultat wird in Abbildung 2 dargestellt). Hierzu gehören:

  • Umbenennen oder Neuanordnen von Eigenschaften (TeamMembers und Supervisor)
  • Aufstellen von Auswahllisten für Eigenschaften, die nur eine begrenzte Anzahl vordefinierter Werte akzeptieren sollen (City, Region, PostalCode, Country, Title und TitleOfCourtesy)
  • Hinzufügen neuer oder berechneter Eigenschaften (NameSummary)
  • Zuordnen detaillierter Geschäftstypen über den Datentyp einer Eigenschaft (BirthData, HireDate, HomePhone, Photo und PhotoPath)

The Entity Designer After Importing from an Existing OData ServiceAbbildung 1: Entity Designer nach dem Importieren aus einem vorhandenen OData-Dienst

The Same Employee Entity After RedesignAbbildung 2: Dieselbe Employee-Entität nach dem Neuentwurf

In LightSwitch kann eine große Anzahl häufig verwendeter Geschäftstypen wie E-mail Address und Phone Number gelesen werden. Weitere finden Sie in den vielen verfügbaren Erweiterungen. Sie können darüber hinaus über ein LightSwitch-Erweiterbarkeitsprojekt eigene Geschäftstypen erstellen. In Bezug auf den zugrunde liegenden Datentyp verbessern Geschäftstypen eine Eigenschaft mit bestimmten Merkmalen wie einer spezialisierten Überprüfung (beispielsweise werden Formate wie E-mail oder Web Address überprüft) und spezifischen erweiterten Eigenschaften (Formaten oder Geschäftstypen für Phone Number ). Sie besitzen zudem häufig spezielle Steuerelemente (standardmäßig) zum Repräsentieren oder Interagieren mit der Eigenschaft in den Clientanwendungen.

Entitäten sind selten vollkommen unabhängig. Mit Entity Designer können Sie bei Bedarf Beziehung zwischen unterschiedlichen Entitäten entwerfen. Diese Beziehungen werden für alle Ebenen durchgesetzt, und zwar durch Code im Client und in der mittleren Ebene sowie durch Fremdschlüssel in der Datenbank beim Entwerfen von Entitäten, die in einer intrinsischen („neuen“) Datenquelle wie SQL Compact, SQL Server oder der Windows Azure SQL-Datenbank gespeichert werden.

Das Definieren neuer Beziehungen für vorhandene Datenquellen stellt jedoch ein wahrhaft leistungsfähiges Feature von LightSwitch dar. Dies ist besonders praktisch beim Weiterentwickeln vorhandener Datensätze, wie XML-Dateien oder alter und beschädigter Datenbanken ohne Indizes, Schlüssel oder ordnungsgemäße Beziehungen. Diese sogenannten virtuellen Beziehungen werden im Client und auf der mittleren Ebene erzwungen, ohne die alte Datenquelle ändern zu müssen. Eine noch leistungsstärkere Funktion ergibt sich daraus, dass diese virtuellen Beziehungen zwischen Entitäten in unterschiedlichen Datenquellen definiert werden können.

Wenn Sie beispielsweise im Projektmappen-Explorer mit der rechten Maustaste auf „Datenquellen“ klicken und „Tabelle hinzufügen“ auswählen, können Sie eine neue Holiday-Entität erstellen, die in einer neuen Datenbank gespeichert wird, die über virtuelle Beziehungen mit der Employee-Entität aus dem Northwind-OData-Dienst verfügt (siehe Abbildung 3).

Virtual Relationships over Different Data SourcesAbbildung 3: Virtuelle Beziehungen in verschiedenen Datenquellen

Ein gutes Beispiel dafür, wie Sie mithilfe von LightSwitch Grenzen der einmaligen Verwendung von Daten in nur einer Anwendung überwinden können, um Mehrwert in einer anderen bereitzustellen, bildet das Erstellen einer Anwendung für die Urlaubsnachverfolgung.

Formen von Daten

In LightSwitch soll die Menge an erforderlichem Code am Anfang auf ein absolutes Minimum reduziert werden, wodurch die anfängliche Entwicklung erheblich beschleunigt wird. Bevor ein Datendienst auch tatsächlich bereitgestellt werden kann, sind häufig Anpassungen und Änderungen zum Formen des Geschäfts innerhalb der Daten erforderlich. Dies kann häufig einfacher im Code als im Editor ausgedrückt werden.

LightSwitch besitzt für jedes vorstellbare Ereignis einen Erweiterungspunkt, auf den im Designer von der Schaltfläche „Code schreiben“ zugegriffen werden kann (siehe Abbildung 4). Je nachdem, ob Ihr Code auf dem Server, im Client oder auf beiden Ebenen abgerufen wird, wird ein Methodenstub erzeugt, wo Sie Ihren benutzerdefinierten Code entweder im Client, in einem allgemeinen oder im Serverunterprojekt eines LightSwitch-Projekts implementieren können.

LightSwitch Supports Many Extension PointsAbbildung 4: Unterstützung vieler Erweiterungspunkte durch LightSwitch

Um auf das Beispiel der Anwendung für die Urlaubsnachverfolgung zurückzukommen, könnten Sie diese Codeerweitungspunkte verwenden, um eine Entität zu initialisieren. Durch den folgenden Code wird beispielsweise der Vorgesetzte eines Mitarbeiters automatisch als Genehmiger für Urlaub zugewiesen, oder es wird sogar der Urlaub genehmigt, wenn dieser Mitarbeiter keinen Vorgesetzten hat.

public partial class ApplicationDataService
{
  // Initializing a new Holiday - server only
  partial void Holidays_Inserting(Holiday entity)
  {
    if (entity.Employee.Supervisor != null)
      entity.ApprovalBy = entity.Employee.Supervisor;
    else
      entity.Approved = true;
  }       
}

Auf ähnliche Weise können Sie mithilfe dieser Codeerweiterungspunkte benutzerdefinierten Überprüfungscode schreiben, der darüber hinausgeht, was der Geschäftstyp der Eigenschaft bereits überprüft:

public partial class Holiday
{
  // Determine if an "EndDate" is valid - executes client and server
  partial void EndDate_Validate(EntityValidationResultsBuilder results)
  {
    if (StartDate > EndDate)
      results.AddPropertyError("End date must follow the start date");
  }
}

Neben benutzerdefinierten Überprüfungs- und Geschäftsregeln wird LightSwitch mit einem integrierten, optionalen Modell für die Kontrolle des Zugriffs geliefert, das auf Rollen und Berechtigungen basiert. Von diesen Codeerweiterungspunkten kann auch die Zugriffskontrolle überprüft werden, und zwar vertikal sowie horizontal.

Bei der vertikalen Zugriffskontrolle werden Beschränkungen basierend auf den Berechtigungen des derzeit angemeldeten Benutzers pro Bildschirm, Entität oder Eigenschaft auferlegt. Der folgende Code beschränkt beispielsweise den Genehmigungsprozess auf Mitarbeiter in einer bestimmten Abteilung der Organisation, wie der Personalabteilung:

public partial class Holiday
{
  // Determine if "Approved" can be modified by the user -
  // executes client and server
  partial void Approved_IsReadOnly(ref bool result)
  {
    result = !Application.User.HasPermission("ApproveHolidays");
  }
}

Bei der horizontalen Zugriffssteuerung wird gefiltert, welche Datensätze für den Endbenutzer sichtbar sind. Beachten Sie, dass dieser Code auf Serverebene ausgeführt wird. Das bedeutet, dass Daten, auf die Endbenutzer nicht zugreifen dürfen, niemals gesendet werden:

public partial class ApplicationDataService
{
  // Filtering out records - runs on the server only
  partial void Holidays_Filter(ref Expression<Func<Holiday, bool>> filter)
  {
    if (!Application.Current.User.HasPermission("ViewAllHolidays"))
      filter = holiday => holiday.Employee.NameSummary == 
        Application.Current.User.FullName ||
        Application.Current.User.FullName == holiday.ApprovalBy.NameSummary;
   }
}

Bei der horizontalen Zugriffskontrolle, auch als „Sicherheit auf Zeilenebene“ bezeichnet, handelt es sich um eine wichtige Erweiterung für LightSwitch in Visual Studio 2012.

Zuerst wird der Filter auf dem Server angewendet. Dadurch wird die Menge der pro Aufruf unnötig übertragenen Daten eingeschränkt, weil der Benutzer sowieso nicht mit diesen Zeilen interagieren darf. Bei der vertikalen Zugriffskontrolle sieht der Benutzer die Daten, obwohl er mit ihnen nicht interagieren kann, weil die Steuerungen schreibgeschützt sind oder bei Zugriffsverletzungen Ausnahmen ausgelöst werden. Bei der horizontalen Zugriffssteuerung werden die zusätzlichen Daten jedoch vollständig für den Endbenutzer ausgeblendet.

Dies bringt uns zu einer weiteren leistungsstarken Verwendung von zeilenbasierter Sicherheit: Sie kann nur bestimmten Benutzern oder Organisationen das Besitzrecht von Teilen des gesamten Datensatzes gewähren. Dadurch können Sie eine Anwendung erstellen, die nur einmal installiert werden muss. Anschließend gewähren Sie verschiedenen Gruppen, Unternehmen, Einzelpersonen oder Organisationen Zugriff. Jeder von ihnen handelt insofern als Mandant, als dass alle dieselbe Clientanwendung und dieselben Dienste verwenden, aber nur ein Datensegment besitzen. Diese mandantenfähigen Installationen senken die Hostingkosten für alle Parteien erheblich. Darüber hinaus entstehen weitere Vorteile wie die Möglichkeit, nur eine Aktualisierung an einem zentralen Standort wie in der Cloud vornehmen zu müssen. Diejenigen, die schon einmal Stunden mit dem Einwählen in Standortserver zum Aktualisieren von Installationen nach der Installation eines wichtigen Hotfixes verbracht haben, gehören sicherlich zu den Ersten, die sich über die Leistung dieser mandantenfähigen Funktionen in LightSwitch 2012 freuen.

Bereitstellen von Daten

Wenn der Wert der Daten eines Unternehmens eingeschätzt werden soll, denken viele nur an das Produkt, in dem die Daten verwendet werden. Das Sammeln und Analysieren von weit gefassten Datenkategorien wird jedoch immer wertvoller. Nach der Befreiung aus dem Silo einer einzigen Anwendung und der korrekten Verarbeitung können Datenanalyse und Data Mining ein zusätzliches Einkommen bieten, das über das traditionelle, produktbasierte Geschäftsmodell hinausgeht. Hierfür müssen unbedingt offene Standards wie das OData-Protokoll genutzt werden, das für den automatisch erstellten Service beim Erstellen eines LightSwitch-Projekts verwendet wird.

Im Folgenden erhalten Sie eine Zusammenfassung von OData auf odata.org:

„Bei OData, kurz für Open Data Protocol, handelt es sich um ein Webprotokoll zum Abfragen und Aktualisieren von Daten ... OData wendet (offene) Webtechnologien wie HTTP, Atom Publishing Protocol und JSON an und basiert auf diesen Technologien … OData ist dahingehend auf die Funktionsweise des Webs abgestimmt, als dass URIs zur Ressourcenidentifizierung und eine HTTP-basierte, einheitliche Benutzeroberfläche zur Interaktion mit diesen Ressourcen festgelegt wurden (wie das Web). Durch dieses Bekenntnis zu grundlegenden Webprinzipien ist durch OData eine neue Ebene der Datenintegration und -interoperabilität über eine Bandbreite an Clients, Servern, Services und Tools hinweg möglich.“

Anders gesagt: Durch OData wird ein Dienst implementiert, mit dem über die Verwendung einfacher HTTP-Verben und Ressourcenbezeichner (oder URLs) interagiert werden kann. Ein OData-Dienst kann von fast jeder Clienttechnologie verwendet werden. Das bedeutet, dass der Dienst in seiner einfachsten Verwendung sogar mit einer HTTP-Anforderung „Get“ von einem Webbrowser durchsucht werden kann, indem zum Beispiel Folgendes als Webadresse eingegeben wird:

 http://services.odata.org/Northwind/Northwind.svc/Customers?$filter=

replace(CompanyName, '%20','')eq'AlfredsFutterkiste'

Eine derartige URL setzt sich immer aus der Stamm-URL des Diensts (dem Endpunkt des Diensts), einem Ressourcenpfad (dem Namen der Entität) und – optional – Abfrageoptionen zusammen. Letzteres ermöglicht einen relativ unabhängigen Einsatz des Dienstes. Das OData-Protokoll verfügt über eine umfassende Abfragesprache, die je nach Bedarf für das Sortieren oder Filtern von Daten über die URL verwendet werden kann. Den vollständigen Satz von Operatoren erhalten Sie unter bit.ly/LSiPAj.

Wenn Sie beim Entwerfen vom LightSwitch-Datendienst wissen, wie die Daten verwendet werden, können Sie aus praktischen Gründen auch den Abfrage-Designer zum Erstellen von Abfragen vor dem Veröffentlichen verwenden. Abbildung 5 zeigt eine einfache Abfrage, in der nur die nicht genehmigten Urlaube zurückgegeben werden, die im aktuellen Jahr beginnen. Die Quelle der Abfrage besteht aus dem gesamten Holidays-Satz, der natürlich durch den Filter, den ich vorher im Code festgelegt habe, vorab gefiltert wird.

Using the Query Designer for a Simple QueryAbbildung 5: Verwenden des Abfrage-Designers für eine einfache Abfrage

Nach einiger Beschäftigung mit Entity Designer und dem Abfrage-Designer ist ein OData-Dienst für die Bereitstellung bereit. Klicken Sie hierfür in der Visual Studio-IDE im Projektmappen-Explorer mit der rechten Maustaste auf das LightSwitch-Projekt, und wählen Sie im Kontextmenü die Option „Veröffentlichen“.

Der Assistent zum Veröffentlichen von LightSwitch-Anwendungen (siehe Abbildung 6) wird angezeigt. Hiermit können Sie ein paar endgültige anwendungsspezifische Eigenschaften einrichten wie erforderliche Verbindungszeichenfolgen, Authentifizierungstypen (keiner, Kombination aus Benutzername und Kennwort oder Windows-Authentifizierung), ein Administratorkonto für die Anwendung und das Ziel der Installation (ein Installationspaket oder direkte Veröffentlichung aus der IDE auf IIS oder in Windows Azure). Die letzte Option wurde in den letzten paar Monaten umfassend verbessert, was die Bereitstellung Ihres Datendiensts in der Cloud zu einer schnellen und komfortablen Erfahrung macht.

The LightSwitch Publish WizardAbbildung 6: LightSwitch-Veröffentlichungs-Assistent

Durch die Übernahme offener Standards wird der Satz an Clients, der für die Interaktion mit diesem Datendienst verwendet werden kann, zu einem Satz, über den fast jeder Endbenutzer bereits verfügt. Tabellenkalkulationsprogramme wie Microsoft Excel ermöglichen die Verwendung des Datendiensts und die Umwandlung in PowerPivot-Tabellen und -Diagramme, ohne dass Programmieren erforderlich ist (siehe Abbildung 7). (Hinweis: PowerPivot ist in Office 2013 integriert und steht für Office 2010 als separates, kostenloses Add-On zur Verfügung.) Sie werden unter bit.ly/xETG0V Schritt für Schritt durch diesen Vorgang geführt.

Consuming a LightSwitch OData Service in ExcelAbbildung 7: Verwenden eines LightSwitch-OData-Diensts in Excel

Erstellen von Clients

Ein anderer zentraler Vorteil von LightSwitch besteht darin, dass Sie mit der gleichen IDE-Erfahrung Clientanwendungen erstellen können. LightSwitch unterstützt beide Thick Clients (Silverlight 5, browserbasiert oder nicht browserbasiert) und mobile Begleitanwendungen (HTML5) mit derselben Entwicklungsgeschwindigkeit oder schneller, die serverseitig geboten wird. Die Möglichkeit, HTML5-Anwendungen zu erstellen, ist nur in der Vorveröffentlichung verfügbar, steht aber nach der endgültigen Veröffentlichung von Visual Studio 2012 als Add-On zur Verfügung.

Klicken Sie in Entity Designer oder im Abfrage-Designer auf die Schaltfläche „Bildschirm hinzufügen“. Dadurch wird ein Assistent angezeigt. Hier können Sie eine Bildschirmvorlage auswählen, die entweder eine der vielen integrierten oder der von Ihnen erstellten oder heruntergeladenen Vorlagen von den verfügbaren Erweiterungen ist.

Durch die Auswahl Ihrer Bildschirmdaten (des Holidays-Entitätssatzes) und einer Vorlage (Listen- und Detailbildschirm) wird das gewünschte Bildschirmlayout schnell erzeugt und im Bildschirm-Designer geöffnet. Sie können dann mit ein paar anfänglichen Änderungen am Layout der Steuerelemente beginnen oder die Verwendung der Steuerelemente insgesamt verändern. In LightSwitch kann das gewünschte, zu verwendende Steuerelement auf Grundlage des Geschäftstyps einer beliebigen Eigenschaft, wie der Verwendung einer Datumsauswahl für eine birth date-Eigenschaft, gut abgeleitet werden. Sie können dies jedoch in ein anderes LightSwitch-Steuerelement ändern, entweder in das mitgelieferte oder in ein Steuerelement, das von verfügbaren Erweiterungen heruntergeladen wurde. Alternativ können Sie XAML-(oder JavaScript- und CSS-)Fähigkeiten mit grenzenlosen Anpassungsmöglichkeiten freien Lauf lassen. An diesem Punkt ist die Anwendung bereit für die Erstellung und Ausführung mit einem Klick auf F5.

Wie Sie in Abbildung 8 erkennen können, ist die Anwendung übersichtlich, intuitiv und vollständig funktional. Nur weil die Erstellung so einfach war, ist sie aber noch lange nicht unvollständig. Im Hintergrund wird beispielsweise auf der Grundlage der Laufzeitinterpretation von Metadaten eine erweiterte Version von MVVM verwendet. Hierauf bin ich näher in einem Onlineartikel im April 2012 eingegangen: „Das LightSwitch-MVVM-Modell“ (msdn.microsoft.com/magazine/hh965661). Aus diesem Grund kann der in Visual Studio verwendete Bildschirm-Designer für das anfängliche Design in der Anwendung aufgerufen werden, indem Sie auf den Link für den Designbildschirm in der unteren rechten Ecke klicken. Auf diese Weise können Sie weitere Änderungen an der Ansicht der Metadaten vornehmen, während die Anwendung im Debug-Modus ausgeführt wird. Diese Änderungen können anschließend in das Projekt zurückgespeichert werden.

A Simple LightSwitch Client ApplicationAbbildung 8: Eine einfache LightSwitch-Clientanwendung

Bei der eingehenden Erkundung der Clientarchitektur von LightSwitch werden Sie auf viele weitere technologische Überraschungen stoßen. Beispielsweise werden Steuerelemente oder Bildschirme automatisch schreibgeschützt oder ausgeblendet, wenn Sie nicht über die Berechtigung zum Bearbeiten der zugrunde liegenden Entität verfügen.

Es ist auch praktisch, dass Sie sich keine Sorgen mehr über das Auslösen von NotifyPropertyChanged-Ereignissen machen müssen, damit Ihre Bindungen ordnungsgemäß funktionieren. Wenn beispielsweise der Endbenutzer die family name-Eigenschaft einer Mitarbeiterentität ändert, wird ein Steuerelement, das an eine berechnete fullname-Eigenschaft gebunden ist (natürlich basierend auf der family name-Eigenschaft) automatisch zum Anzeigen des neuen Werts aktualisiert.

Apropos Eigenschaften: Alle im Client verwendeten Modelle sind tatsächlich „dual-dispatcher-Objekte“, mit denen die Benutzeroberfläche reaktionsfähig gehalten wird, während Geschäftslogik verarbeitet wird. Vom UI-Thread können Sie einer Eigenschaft ganz einfach einen Wert zuordnen. Dadurch wird intern eine Benachrichtigung gesendet, die nach Priorität in einem zweiten Thread, dem logischen Thread abgerufen wird. Nachdem die Geschäftslogik verarbeitet wurde, wird mit demselben Ereignisbenachrichtigungssystem der UI-Thread des eventuellen Endergebnisses informiert, und die Benutzeroberfläche wird entsprechend aktualisiert.

Ich möchte noch eine letzte interessante Tatsache zum Client mit Ihnen teilen. Sie wurde dem aktiven Teamblog zu Visual Studio LightSwitch entnommen, wo erklärt wird, dass jeder Bildschirm tatsächlich eine Arbeitseinheit darstellt (siehe bit.ly/9vENdF). Jeder Bildschirm besitzt einen eigenen Datenarbeitsbereich, der mit allen untergeordneten Bildschirmen gemeinsam verwendet wird, die von dem ursprünglichen Bildschirm geöffnet wurden, wie Popups oder der Detailbildschirm einer Entität. Alle Änderungen bleiben lokal, bis der Endbenutzer entscheidet, sie zu speichern oder zu verwerfen. Folglich können Sie durch zweimaliges Öffnen eines Bildschirms simulieren, wie in LightSwitch verschiedene Benutzer verarbeitet werden, die an einigen Daten simultan Änderungen vornehmen und sie dann gleichzeitig speichern (siehe Abbildung 9). (Das Zulassen mehrerer Instanzen ist standardmäßig deaktiviert, kann aber im Eigenschaftenfenster des Bildschirm-Designers aktiviert werden.)

Handling Concurrent ModificationsAbbildung 9: Verarbeiten gleichzeitiger Änderungen

Wenn Sie sich darüber wundern sollten, wie gut dies in LightSwitch verarbeitet wird, erinnern Sie sich vielleicht an meine Eingangsbemerkung, dass LightSwitch nicht nur mit allen diesen Anforderungen umgehen kann, sondern sie sogar in allen Punkten perfekt erfüllt.

Jan Van der Haegen ist ein Ökocomputerfreak, der sogar Kaffee in Software verwandelt. Darüber hinaus ist er der stolze Scrum-Meister eines internationalen Teams von Centric Belgium und so besessen von der .NET-Technologie (insbesondere von Visual Studio LightSwitch), dass er einen Blog zu seinen Programmierexperimenten führt. Seine neuesten Abenteuer finden Sie unter switchtory.com/janvan.

Unser Dank gilt den folgenden technischen Experten für die Durchsicht dieses Artikels: Joe Binder und Beth Massi