Ab Silverlight 3 kommt mit Out-of-Browser (kurz OOB) ein
attraktives Feature mit sich. Somit lassen sich Silverlight Anwendungen auch
außerhalb vom Browser ausführen. Das besondere daran ist, das die Silverlight Anwendung
somit Offline zur Verfügung steht. Damit dieses Feature aktiviert und genutzt
werden kann, muss lediglich die AppManifest.xml verändert werden. In der Datei
ist eine bestehende Deklaration Kommentiert, der nur manuell freigegeben werden
muss. Der verfügbare Text steht nun für den Titel und für die Beschreibung der
späteren Anwendung. Auch das hinzufügen eines beliebigen Icons ist hier
möglich.
Abb.1.1. – OOB Feature in
AppManifest.xml aktivieren.
Bei der gestarteten Silverlight Anwendung steht jetzt
mittels rechtsklick ein weiterer Aktiver Auswahlpunkt im Menü „Install Out of
Browser Silverlight…“. Folgend erscheint ein Dialog mit der Anfrage, wo eine
Verknüpfung zur Anwendung angelegt werden soll. Die Installation wird ohne
Administratorrechte durchgeführt. Dies wird ermöglicht, da die Silverlight
Anwendung in das Benutzerprofil (Roaming-Profil) kopiert wird. Dabei wird die
XAP-File und Meta-Informationen, wie zum Beispiel die URL des Servers in
zusätzlichen Dateien abgelegt. Der Pfad der Offline Dateien liegt demnach
unter: „C:\Users\...\AppData\LocalLow\Microsoft\Silverlight\Offline“.
Die Installation des OOB kann auch manuell im Source-Code ausgelöst
werden. Wichtig! Dies ist nur möglich in einem Event, das von einem Benutzer
ausgeführt wurde, zum Beispiel mittels Click-Event. Mit folgendem Code wird
dies umgesetzt: Application.Current.Detach();.


Abb.1.2. – Silverlight Anwendung
Offline Installieren.
Das Deinstallieren der Anwendung geschieht auf dem gleichen
Weg mittels wiederholten Rechtsklicks auf die Anwendungsoberfläche und dann im
Menü unter „Remove this application“.
Abb.1.3. –Silverlight Anwendung
Deinstallieren.
Sehr Attraktiv ist auch das sich die Offline Anwendung
automatisch Updatet und Aktualisiert sobald sich auf dem Herkunftsserver eine
neue Version anbietet. Wenn die Anwendung dazu einen weiteren Neustart oder
andere beliebige Logik benötigt, kann das Updaten vorher durch Events
abgefangen und behandelt werden.
Über den Status Informiert sein
Bei Silverlight Anwendungen befindet sich die Hauptsächliche
Geschäftslogik auf dem Server. Nun wird aber bei einer Offline-Anwendung eine
eingeschränkte Logik abverlangt. Das dies Aktiviert und erkannt werden kann
gibt es weitere Klassen und Events, die dafür zur Verfügung stehen.
Zum einem ist es das Event NetworkAddressChanged aus der KlasseNetworkChange. Das sofort
ausgelöst wird, wenn auf dem Client sich der Status des Netzwerkes ändert
(siehe Abb.1.4).
Abb.1.4. –Das NetworkAddressChanged-Event
Außerdem kann der Status auch direkt von der Application-Klasse
abgefragt werden.
Abb.1.5. –Direkte Abfrage über den
Status der Anwendung
Silverlight OOB Extension

Wie bereits erwähnt werden bei Silverlight Anwendungen die
Hauptsächliche Logik und deren Daten vom Server geliefert. Wenn eine
Silverlight Anwendung nun Offline zur Verfügung steht, ist es kein Problem diesen
Status herauszufinden und dementsprechend zu reagieren. Doch wie sieht es mit
den Daten aus? Diese können Offline auch nicht mehr vom Server abgefragt
werden. Bisher bietet Silverlight 3 in der aktuellen Betaversion keinen
Lösungsansatz dafür an.
Um diese Anforderung abzudecken habe ich das Projekt
Silverlight OOB extension als Open-Source auf Codeplex ins Leben gerufen. Die
Vision des Projektes besteht darin, das Silverlight Anwendungen die auch
Offline ausgeführt werden sollen auch Ihre Daten geliefert bekommen. Diese
sollen je nach Logik zur Verfügung stehen und später an einem zusätzlichen
Web-Service, der mit dem Sync Framework ausgestattet ist, aktualisiert werden
können.
Die erste veröffentlichte Library befindet sich noch im
Alpha Status und kann derzeit nur Daten zum Lesen zur Verfügung stellen. Bei
Daten sind dabei lediglich Objekte mit Informationen bedacht. Dabei müssen die
Entities das Attribut „Serializable“ tragen oder sie kommen aus einer Windows
Communication Foundation-Schnittstelle (WCF). Das wäre zum Beispiel von einem ADO.NET
Data Service oder einem normalen Standard Web-Service.
Die OOB Extension verwenden
Das implementieren der Extension ist sehr einfach. Dazu muss
lediglich die Library silverlight.oob.extension.dll in die Referenzen
(Verweise) hinzugefügt werden. Dazu muss man anschließend dann den Namespace
mittels „using Silverlight.OOB.extension;“ deklarieren.
Jetzt muss für jedes Objekt das später offline zur Verfügung
gestellt werden soll, eine Instanz der Klasse OfflineCaching gefolgt von der
Klasse des gewünschten Objekts erzeugen. Im folgenden Beispiel wird für die
Klasse Customers aus der Northwind Datenbank ein OfflineCache-Objekt erzeugt.
Die Klasse Customers wird später von ADO.NET Data Services als IEnumerable zur Verfügung
gestellt. Daher wird sofort bei der OfflineCaching-Klasse mit Deklariert (siehe
Abb.1.6).
Wenn die Daten nun vom Server geliefert werden, muss das vom
OfflineCaching-Objekt mittels Cast-Methode in den Speicher abdrücken. Das
Customers-Objekt wird anschließend sofort wieder zurückgegeben, so dass dies
direkt zwischen dem Data-Binding gehängt werden kann.
Abb.1.6. –Instanz der Klasse
OfflineCaching für die Klasse Customers.
Beim wiederholten Starten der Anwendung kann jetzt abgefragt
werden ob dies im OOB geschieht. Wichtig dabei ist, dass gleich nochmal
abgefragt werden muss, ob überhaupt Daten zum gewünschten Objekt im Speicher
enthalten sind. Dazu wird die Methode IsChachingSessionExists()
zur Verfügung gestellt. Demgemäß kann dann direkt ein Data-Binding vom Speicher
durch die Methode GetDataFromOfflineCaching()
an DataContext oder an ItemsSource hinzufügen
Abb.1.8. – Daten vom Speicher direkt
mittels Data-Binding hinzufügen.
Projektseite auf Codeplex
http://oobextension.codeplex.com
Fazit
Diese einfache Funktionalität läuft bereits sehr Stabil.
Weitere Features werden derzeit Programmiert. Es ist gerne jeder willkommen der
ernsthaft Interesse hat an diesem Projekt teilzunehmen. Bitte einfach eine E-Mail
an mich über den Blog hier. Gerne höre ich auch Feedback über die Verwendung
der Library in eigene Projekte oder anderen Anregungen wie zum Beispiel weitere
Feature wünsche, Bug-Meldungen etc.
Jeder auch nur so kleine Artikel, Blog-Eintrag oder Newsmeldung
unterstützt das Projekt und ich bin sehr Dankbar für jede Hilfe an dieser Stelle.
Video
Um das besser Verbildlichen zu können gibt es auch ein
kleines Einsteiger Video dazu auf Youtube:
http://www.youtube.com/watch?v=idBE-yXfeDA
Wenn ihnen der Artikel gefallen hat oder er für sie hilfreich war, bitten "kicken" sie ihn.
