Visual Studio 2010中Silverligh實現頁面動態裝配(2) 軟件測試
.NET 4.0中提供了一個MEF框架用于開發支持插件的軟件系統,幸運的是,Silverlight 4也支持MEF,這就使得我們可以很容易地實現頁面的動態裝配功能。
下面簡介一下此頁面中的關鍵代碼,首先,我們需要指定Home.xaml頁面“需要”一個IMyPart部件,為此,我們給Home類添加以下屬性,并且給其附加“[Import]”標記:
[Import(typeof(IMyPart))] public IMyPart mypart { get; set; }
在Home.xaml頁面初次顯示時,并不加載部件程序集,當用戶點擊按“我要編輯文本”按鈕后,動態創建一個WebClient對象從Web網站上下載程序集:
private void DownloadAssemblyAndCompose() { //獲取程序集的URI string uri = Application.Current.Host.Source.AbsoluteUri; int index = uri.IndexOf("/ClientBin"); //找出根URL uriuri = uri.Substring(0, index) + "/MyParts/MyPageParts.dll"; WebClient client = new WebClient(); this.txtInfo.Text = "正在下載文本編輯器組件……"; client.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted); //啟動異步下載 client.OpenReadAsync(new Uri(uri)); this.btnShowEditor.IsEnabled = false; //防止用戶第二次啟動下載…… }
注意:在本示例中我們假設所有的可裝配部件都放在Web網站的MyParts文件夾下,并且假設我們已經知道了要下載的程序集文件名。在實際項目中,我們可以設計一個用于掃描部件文件夾并向Silverlight客戶端返回可裝配部件的WCF Service,以允許真正“全動態”的裝配工作。上述代碼為WebClient的下載完畢事件(OpenReadCompletedEvent)掛接了一個事件響應方法,其中包容了本例最核心的功能代碼:
void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) { //加載資源 AssemblyPart part = new AssemblyPart(); Assembly ass = part.Load(e.Result); //提取程序集 //創建Catalog AssemblyCatalog cata = new AssemblyCatalog(ass); CompositionContainer container = new CompositionContainer(cata); CompositionBatch bat = new CompositionBatch(); bat.AddPart(this); container.Compose(bat); //裝配…… //顯示裝配好的頁面組件 if (mypart != null) MyEditorContainer.Content = mypart; }
上述代碼中的關鍵在于下載程序集完成之后,從流中動態加載程序集,然后再調用MEF來裝配部件。
5 最后一步,在Web網站中創建一個專用的部件文件夾“MyParts”,將包容了可裝配部件的程序集復制到這一文件夾下。
下圖展示了示例項目運行時動態下載并組裝頁面的截圖:
從本示例看到,將MEF和WebClient組件結合起來,可以讓我們實現Silverlight頁面的“按需下載”和“動態組合”,充分展示了Silverlight 4的強大功能!
原文轉自:http://www.anti-gravitydesign.com