#25 - Caricamento differito di assembly o di porzioni di progetto in Silverlight 2.0

Alessio Leoncini

di Alessio Leoncini, in Silverlight 2.0, 30 ottobre 2008

Archiviato in: , ,

Uno dei principi fondamentali da seguire durante lo sviluppo di un'applicazione web è quello di ridurre al minimo la quantità di dati da far scaricare all'utente durante l'uso del programma, in modo da diminuire i tempi di attesa e migliorare l'usabilità complessiva.

In un progetto Silverlight 2.0 è possibile scaricare l'interfaccia iniziale contenente le funzionalità principali e caricare successivamente le altre porzioni del progetto in funzione di precise azioni dell'utente o dell'applicazione stessa.

Un progetto Silverlight 2.0 è "impacchettato" in un file di tipo XAP che contiene sia gli assembly dell'interfaccia che quelli della logica applicativa. Dividendo il progetto in più file XAP è possibile eseguire il download di ciascun pacchetto con una semplice chiamata remota attraverso l'oggetto WebClient:

WebClient client = new WebClient(); 
client.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted);  
Uri uriOfSecondXap = new Uri(GetBaseUri(), "ClientBin/SilverlightApplication2.xap"); 
client.OpenReadAsync(uriOfSecondXap);

Al termine del download del file XAP è necessario operare attraverso reflection per eseguire l'istanza sia dell'assembly principale che di quelli referenziati:

void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) 
{ 
    //recupero dello stream del file xap del progetto 
    StreamResourceInfo resourceInfo = new StreamResourceInfo(e.Result, null); 
    //Uri del manifest (contiene l'elenco degli assembly del progetto) 
    Uri appManifestUri = new Uri("AppManifest.xaml", UriKind.Relative); 
    //recupero dello stream del manifest  
    StreamResourceInfo manifestStream = App.GetResourceStream(resourceInfo, appManifestUri); 
    //conversione in testo del manifest 
    string appManifest = new StreamReader(manifestStream.Stream).ReadToEnd(); 
 
    //conversione del testo del manifest in struttura XML 
    XElement appManifestRoot = XDocument.Parse(appManifest).Root; 
    //estrazione della lista dei nomi degli assembly del progetto 
    List<XElement> projectParts = (from parts in appManifestRoot.Elements().Elements() 
                                   select parts).ToList(); 
 
    Assembly asm = null; 
 
    //ciclo dei nodi del manifest 
    foreach (XElement item in projectParts) 
    { 
        //nome dell'assembly 
        string source = item.Attribute("Source").Value; 
        Uri sourceUri = new Uri(source, UriKind.Relative); 
        //recupero dello stream dell'assembly 
        StreamResourceInfo appStream = App.GetResourceStream(resourceInfo, sourceUri); 
        AssemblyPart asmPart = new AssemblyPart(); 
 
        if (source == "SilverlightApplication2.dll") 
        { 
            //qualora sia l'assembly principale: 
            asm = asmPart.Load(appStream.Stream); 
        } 
        else 
        { 
            //nel caso di assembly referenziati dal principale: 
            asmPart.Load(appStream.Stream); 
        } 
    } 
 
    //per l'assembly principale si crea l'istanza dell'UserControl specifico utilizzando Reflection 
    FrameworkElement element = asm.CreateInstance("SilverlightApplication2.Page") as FrameworkElement; 
    //posizionamento dell'UserControl nella scena 
    PlaceHolder.Children.Add(element); 
}

Nota: Questo script contiene un allegato.

SCRIPT VIA E-MAIL

Iscriviti alle nostre newsletter unoscript@lgiorno e Xcript per ricevere gli script via e-mail.

MEDIA
IN EVIDENZA
MISC