2010-05-20 11 views
5

Sollte das Laden von OnDemand Prism Modulen in einem OOB Szenerio funktionieren? Wenn dem so ist, kann ich es nicht funktionieren lassen. Im Browser läuft derzeit alles ohne Probleme. Insbesondere I: meine Module in Code registrieren:Wird das Prism OnDemand-Modul in einem OOB-Szenario geladen?

protected override IModuleCatalog GetModuleCatalog() { 
     var catalog = new ModuleCatalog(); 
     Uri source; 

     if(Application.Current.IsRunningOutOfBrowser) { 
      source = IsolatedStorageSettings.ApplicationSettings[SOURCEURI] as Uri; 
     } 
     else { 
      var src = Application.Current.Host.Source.ToString(); 
      src = src.Substring(0, src.LastIndexOf('/') + 1); 
      source = new Uri(src); 
      IsolatedStorageSettings.ApplicationSettings[SOURCEURI] = source; 
      IsolatedStorageSettings.ApplicationSettings.Save(); 
     } 

     if(source != null) { 
      var mod2 = new ModuleInfo { InitializationMode = InitializationMode.OnDemand, 
          ModuleName = ModuleNames.mod2, 
          ModuleType = "mod2.Module, mod2.Directory, '1.0.0.0', Culture=neutral, PublicKeyToken=null"), 
          Ref = (new Uri(source, "mod2.xap")).AbsoluteUri }; 

      catalog.AddModule(mod2); 
     } 

// per Jeremy Likeness - did not help. 
     Application.Current.RootVisual = new Grid(); 

     return (catalog); 
    } 

späte Anfrage für das Modul geladen werden hergestellt:

mModuleManager.LoadModule(ModuleNames.mod2); 

und wartet auf eine Antwort auf ein Ereignis während der Initialisierung der geladenen veröffentlicht Modul.

Das Modul scheint nie geladen werden, und wenn die Anwendung unter dem Debugger ausgeführt wird es ein Meldungsfeld, das besagt, dass der Web-Server einen ‚nicht gefunden‘ Fehler zurückgegeben. Ich kann die anfragende URL für das Modul nehmen und es in Firefox eingeben und das Modul ohne Probleme herunterladen.

Ich habe nicht in der Lage gewesen, eine Bezugnahme auf dieses tatsächlich sind praktikabel zu finden, aber es scheint, als ob es sein sollte. Das meiste, was ich zu dem Thema gefunden habe, ist ein blog entry by Jeremy Likeness, der das Laden von Modulen in MEF behandelt, aber das Anwenden seines Wissens hier half nicht.

Der Server localhost ist (ich habe gehört, dass es erwähnt, dass dies zu Problemen führen). Der Server hat eine clientaccesspolicy.xml-Datei - obwohl ich nicht erwarte, dass das nötig ist. Ich bin mit dem Client-Stack und registrieren sie während app Aufbau:

WebRequest.RegisterPrefix(Current.Host.Source.GetComponents(UriComponents.SchemeAndServer, UriFormat.UriEscaped), WebRequestCreator.ClientHttp); 

Followup Fragen:

Kann all die xaps auf dem Client-Desktop in irgendeiner Art und Weise installiert werden - oder nur die Hauptanwendung xap? gib sie irgendwie in appmanifest.xml an ??

Lohnt es sich, diese Arbeit machen, wenn nur die application.xap installiert ist, und der Rest der xaps muss sowieso heruntergeladen werden?

+0

Ich bin auch neugierig auf diese Antwort - ich arbeite OOB und muss mein Projekt aufteilen ... – Rodney

Antwort

1

Einmal arbeitete ich auf ein ähnliches Szenario. Der Trick besteht darin, die Module im isolierten Speicher zu speichern und einen Modullader zu verwenden, der beim Offline-Arbeiten aus dem isolierten Speicher liest.

Dies liegt daran, andernfalls Sie die Module nicht Download können, die als die Shell in einer anderen XAP-Datei sind.

Danke, Damian

0

Es ist möglich, benutzerdefinierte Modul Lader in Prism einzuhaken, wenn Sie bereit sind, die Prism-Quelle zu optimieren und diese selbst zu bauen. Ich konnte das ziemlich einfach zum Laufen bringen - in unserer App suche ich zuerst auf dem Datenträger nach dem Modul, und wenn es nicht gefunden wird, kann ich es über einen kommerziellen HTTP-Stack eines Drittanbieters, der unterstützt, vom Server laden Clientzertifikate.

Laden Sie dazu den Prism-Quellcode herunter, und suchen Sie die Microsoft.Practices.Composite.Modularity.XapModuleTypeLoader-Klasse. Diese Klasse verwendet eine andere Prism-Klasse, Microsoft.Practices.Composite.Modularity.FileDownloader, um den .xap-Inhalt herunterzuladen. aber es instantiiert es direkt und gibt dir keine Chance, dir selbst oder was auch immer zu injizieren.

So - in XapModuleTypeLoader, habe ich eine statische Eigenschaft die Art des Downloader einzustellen:

public static Type DownloaderType { get; set; } 

dann modifiziert I die CreateDownloader() Methode der eingangs genannten Art bevorzugt, der einen Standard festgelegt sind zu verwenden:

protected virtual IFileDownloader CreateDownloader() { 
    if (_downloader == null) { 
     if (DownloaderType == null) { 
      _downloader = new FileDownloader(); 
     } else { 
      _downloader = (IFileDownloader)Activator.CreateInstance(DownloaderType); 
     } 
    } 

    return _downloader; 
} 

Wenn mein app startet, ich eine Immobilie zu meinem eigenen Downloader Typen festgelegt:

XapModuleTypeLoader.DownloaderType = typeof(LocalFileDownloader); 

Voila - jetzt ruft Prism Ihren Code auf, um seine Module zu laden.

Ich kann Ihnen meine LocalFileDownloader-Klasse sowie die Klasse senden, auf die sie zurückgreifen soll, um die .xap aus dem Internet zu laden, wenn Sie interessiert sind ... Ich vermute jedoch, dass Sie, wenn Sie sich Prisms FileDownloader-Klasse ansehen sehen Sie, dass es einfach genug ist.

In Bezug auf Ihre anderen Fragen wird die Datei clientaccesspolicy.xml wahrscheinlich nicht benötigt, wenn die URL, unter der die App installiert ist, dieselbe ist, mit der Sie sprechen, oder wenn Sie eine erhöhte Vertrauenswürdigkeit haben.

Die .xaps kann definitiv auf dem Client vorinstalliert werden, aber es ist ein wenig Arbeit. Wir haben eine Launcher-App geschrieben, die eine eigenständige .NET 2.0-Desktop-App ist. Es lädt die Haupt-.xap plus bestimmte Module * herunter (prüft nach Updates und lädt nur bei Bedarf), deinstalliert/installiert dann die App bei Bedarf neu und startet dann die App. Die letzten beiden werden über sllauncher.exe ausgeführt, das als Teil von Silverlight installiert wird. Hier ist ein gutes Intro: http://timheuer.com/blog/archive/2010/03/25/using-sllauncher-for-silent-install-silverlight-application.aspx.

Angenommen, Sie arbeiten unter erhöhter Vertrauenswürdigkeit, sollte es auch möglich sein, die Modul-.xaps im SL-Client vorzuholen, aber bevor sie aufgrund von Benutzeraktionen angefordert werden. Sie müssen sie nur irgendwo unter Eigene Dateien in einen Ordner legen und dann den oben beschriebenen Ladevorgang für benutzerdefinierte Module verwenden, um sie von dort zu holen.

* In unserem Fall ist unsere Hauptversion .xap 2/3 der Anwendung. Der Rest unserer .xaps ist klein, also werden sie sofort heruntergeladen, mit Ausnahme einiger .xaps, die wir als Container für Komponenten von Drittanbietern erstellt haben. Wir erwarten nicht, diese sehr oft zu aktualisieren, also installieren wir sie vorinstalliert.