2010-05-20 21 views
5

Il caricamento dei moduli OnDemand Prism dovrebbe funzionare in uno scenerio OOB? Se è così, non riesco a farlo funzionare. Tutto funziona attualmente nel browser senza problemi. Specificamente I: registra la moduli in codice:Will Prism OnDemand caricamento del modulo funziona in uno scenerio OOB?

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); 
    } 

richiesta successiva per il modulo da caricare è fatto:

mModuleManager.LoadModule(ModuleNames.mod2); 

e attendere una risposta a un evento pubblicato durante l'inizializzazione di tale loaded modulo.

Il modulo sembra non essere mai stato caricato e quando l'applicazione è in esecuzione nel debugger verrà visualizzata una finestra di messaggio che indica che il server Web ha restituito un errore "non trovato". Posso prendere l'url di richiesta per il modulo e inserirlo in Firefox e scaricare il modulo senza problemi.

Non sono stato in grado di trovare alcun riferimento a questo in realtà essere praticabile, ma sembra come dovrebbe. Il più che ho trovato sull'argomento è un blog entry by Jeremy Likeness, che copre i moduli di caricamento in MEF, ma applicare le sue conoscenze qui non ha aiutato.

Il server è localhost (ho sentito dire che ciò potrebbe causare problemi). Il server ha un file clientaccesspolicy.xml, anche se non mi aspetto che sia necessario. Sto usando lo stack client e registrarlo durante la costruzione app:

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

domande ollowup:

Possono tutti i xaps essere installato sul desktop client in qualche modo - o solo l'XAP principale? specificarli in appmanifest.xml in qualche modo ??

Vale la pena farlo funzionare se solo il file application.xap è installato e il resto delle xaps deve essere scaricato comunque?

+0

Sono anche curioso di sapere questa risposta - Sto lavorando OOB e ho bisogno di dividere il mio progetto ... – Rodney

risposta

1

Una volta ho lavorato su uno scenario simile. Il trucco è avere i moduli memorizzati in una memoria isolata e utilizzare un caricatore di moduli che legge da una memoria isolata quando si lavora offline.

Questo perché altrimenti non è possibile scaricare i moduli che si trovano in un file .xap diverso da Shell.

Grazie, Damian

0

E 'possibile agganciare caricatori modulo personalizzato in Prism se siete disposti a modificare la fonte Prism e costruire da soli. In realtà sono riuscito a far funzionare tutto questo facilmente - nella nostra app, prima guardo il disco per il modulo, e se non viene trovato, ricado al caricamento dal server tramite uno stack HTTP commerciale di terze parti che supporta certificati client.

Per fare ciò, scaricare il codice sorgente di Prism e individuare la classe Microsoft.Practices.Composite.Modularity.XapModuleTypeLoader. Questa classe utilizza un'altra classe Prism, Microsoft.Practices.Composite.Modularity.FileDownloader, per scaricare il contenuto .xap; ma lo istanzia direttamente, non dandoti la possibilità di iniettare il tuo o qualsiasi altro.

Così - in XapModuleTypeLoader, ho aggiunto una proprietà statica per impostare il tipo di downloader:

public static Type DownloaderType { get; set; } 

Poi ho modificato il metodo CreateDownloader() per utilizzare il tipo sopra specificato a preferenza di quello di default:

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

    return _downloader; 
} 

Quando la mia applicazione si avvia, ho impostato la proprietà per il mio tipo di downloader:

XapModuleTypeLoader.DownloaderType = typeof(LocalFileDownloader); 

Voila - ora Prism chiama il tuo codice per caricare i suoi moduli.

Posso inviarti la mia classe LocalFileDownloader e la classe in cui rientra per caricare il .xap dal web, se sei interessato ... Sospetto però che se guardi la classe FileDownloader di Prism ti vedi che è abbastanza semplice.

Per quanto riguarda le altre tue domande, il file clientaccesspolicy.xml probabilmente non è necessario se l'URL in cui è installata l'app è uguale a quello con cui stai parlando o se hai una fiducia elevata.

Gli .xaps possono essere preinstallati sul client, ma è un po 'di lavoro. Quello che abbiamo fatto è stato scrivere un'app launcher che sia un'app desktop .NET 2.0 autonoma. Scarica il file .xap principale e alcuni moduli * (verifica la disponibilità di aggiornamenti e il download solo se necessario), quindi disinstalla/reinstalla l'app, se necessario, quindi avvia l'app. Gli ultimi due vengono eseguiti tramite sllauncher.exe, che viene installato come parte di Silverlight. Ecco una buona introduzione a questo: http://timheuer.com/blog/archive/2010/03/25/using-sllauncher-for-silent-install-silverlight-application.aspx.

Supponendo che si stia eseguendo con un livello di attendibilità elevato, dovrebbe anche essere possibile precaricare il modulo .xaps dall'interno del client SL, ma prima che venga effettivamente richiesto a causa dell'azione dell'utente. Dovresti solo metterli in una cartella in Documenti da qualche parte, e quindi usare l'approccio di caricamento del modulo personalizzato descritto sopra per estrarli da lì.

* Nel nostro caso, il nostro .xap principale è 2/3 dell'applicazione. Il resto dei nostri .xaps è piccolo, quindi li scarichiamo al volo, ad eccezione di alcuni .xaps creati come contenitori per componenti di terze parti. Non ci aspettiamo di aggiornarli molto spesso, quindi li pre-installiamo.