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);
}Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.


