新聞中心
.NET 4.0中提供了一個MEF框架用于開發(fā)支持插件的軟件系統(tǒng),幸運的是,Silverlight 4也支持MEF,這就使得我們可以很容易地實現(xiàn)頁面的動態(tài)裝配功能。

創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站制作、成都網(wǎng)站建設(shè)、高縣網(wǎng)絡(luò)推廣、重慶小程序開發(fā)、高縣網(wǎng)絡(luò)營銷、高縣企業(yè)策劃、高縣品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供高縣建站搭建服務(wù),24小時服務(wù)熱線:13518219792,官方網(wǎng)址:www.cdcxhl.com
用戶在訪問Silverlight應(yīng)用程序時,開始可以只顯示一個“初始的簡單的”頁面,當(dāng)用戶需要時,動態(tài)從Web網(wǎng)站上下載新的程序集,然后,Silverlight客戶端應(yīng)用程序再使用MEF將動態(tài)下載的程序集中所包容的頁面組件“組裝”為一個新的功能增強了的頁面,示例解決方案DynamicComposePage展示了相關(guān)的技術(shù)細節(jié)。下面簡要介紹一下其開發(fā)步驟。
1 使用Visual Studio 2010創(chuàng)建一個名為DynamicComposePage的Silverlight Business Application項目,Visual Studio 2010將會幫助我們創(chuàng)建一個名為DynamicComposePage.Web的ASP.NET網(wǎng)站,它引用名為DynamicComposePage的Silverlight項目。
在解決方案資源管理器中展開DynamicComposePage項目節(jié)點,在其Views文件夾下可以看到Visual Studio 2010生成的一個Home.xaml頁面,等一會我們將修改此頁面實現(xiàn)頁面的動態(tài)裝配。
2 現(xiàn)在需要提供一個MEF部件都遵循的接口,為此,向解決方案中添加一個“Silverlight類庫(Silverlight Class Library)”項目[1]MyPartContract,并向其中添加一個IMyPart接口,為簡單起見,本例不為此接口添加任何成員,當(dāng)然,在實際開發(fā)中可以依據(jù)需要為其添加合適的成員。
- namespace MyPartContract
- {
- public interface IMyPart
- {
- }
- }
注意:這不是普通的“類庫”項目,Silverlight所使用的程序集是重新編寫的,與標(biāo)準(zhǔn)的.NET Framework不一樣。
3 下面定義可供動態(tài)組合的Silverlight頁面組件。
向示例解決方案中添加一個名為“MyPageParts”的“Silverlight類庫(Silverlight Class Library)”項目,注意在彈出的對話框中選擇“Silverlight 4”。然后,向MyPageParts項目中添加一個“Silverlight User Control”,取名“MyEditorControl”,在這個頁面中我們將放置一個RichTextArea控件充當(dāng)文字編輯器:
現(xiàn)在,需要讓此用戶控件可以被MEF動態(tài)裝配,為此,需要完成兩個步驟:
(1)給本項目(也包括前面創(chuàng)建的Silverlight項目DynamicComposePage)都添加對包容了IMyPart接口的Silverlight類庫MyPartContract的引用。
(2)給本項目(也包括前面創(chuàng)建的Silverlight項目DynamicComposePage)都添加對MEF核心程序集System.ComponentModel.Composition.dll的引用,將要負責(zé)完成“裝配”工作的Silverligh項目DynamicComposePage還需要添加對另一個核心程序集System.ComponentModel.Composition.Initialization.dll的引用。注意:在以下位置才能找到上述程序集:C:\Program Files\Microsoft SDKs\Silverlight\v4.0\Libraries。下面是支持MEF動態(tài)裝配的Silverlight 4用戶控件的相應(yīng)代碼,注意其中的“[Export]”標(biāo)記:
- [Export(typeof(IMyPart))]
- public partial class MyEditor : UserControl,IMyPart
- {
- public MyEditor()
- {
- InitializeComponent();
- }
- }
4 現(xiàn)在開發(fā)進行“動態(tài)裝配”的Silverlight頁面(位于DynamicComposePage項目Views文件夾中的Home.xaml),在頁面上放置一個Button用于啟動裝配過程,另一個TextBlock用于顯示提示信息,更重要地,放置一個ContentControl作為部件容器,用于顯示動態(tài)裝配出來的頁面部件:
- ……
#p#
下面簡介一下此頁面中的關(guān)鍵代碼,首先,我們需要指定Home.xaml頁面“需要”一個IMyPart部件,為此,我們給Home類添加以下屬性,并且給其附加“[Import]”標(biāo)記:
- [Import(typeof(IMyPart))]
- public IMyPart mypart { get; set; }
在Home.xaml頁面初次顯示時,并不加載部件程序集,當(dāng)用戶點擊按“我要編輯文本”按鈕后,動態(tài)創(chuàng)建一個WebClient對象從Web網(wǎng)站上下載程序集:
- 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; //防止用戶第二次啟動下載……
- }
注意:在本示例中我們假設(shè)所有的可裝配部件都放在Web網(wǎng)站的MyParts文件夾下,并且假設(shè)我們已經(jīng)知道了要下載的程序集文件名。在實際項目中,我們可以設(shè)計一個用于掃描部件文件夾并向Silverlight客戶端返回可裝配部件的WCF Service,以允許真正“全動態(tài)”的裝配工作。上述代碼為WebClient的下載完畢事件(OpenReadCompletedEvent)掛接了一個事件響應(yīng)方法,其中包容了本例最核心的功能代碼:
- void client_OpenReadCompleted(object sender,
- OpenReadCompletedEventArgs e)
- {
- //加載資源
- AssemblyPart part = new AssemblyPart();
- Assembly ass = part.Load(e.Result); //提取程序集
- //創(chuàng)建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;
- }
上述代碼中的關(guān)鍵在于下載程序集完成之后,從流中動態(tài)加載程序集,然后再調(diào)用MEF來裝配部件。
5 最后一步,在Web網(wǎng)站中創(chuàng)建一個專用的部件文件夾“MyParts”,將包容了可裝配部件的程序集復(fù)制到這一文件夾下。
下圖展示了示例項目運行時動態(tài)下載并組裝頁面的截圖:
從本示例看到,將MEF和WebClient組件結(jié)合起來,可以讓我們實現(xiàn)Silverlight頁面的“按需下載”和“動態(tài)組合”,充分展示了Silverlight 4的強大功能!
【編輯推薦】
- Visual Studio 2010中Parallel類實現(xiàn)并行計算
- Visual Studio 2010中C++項目升級指南
- Visual Studio 2010中測試用例工作項類型介紹
- 在Visual Studio 2010選擇合適的項目測試方法
- 細數(shù)VS 2003到Visual Studio 2010的開發(fā)之路
網(wǎng)站名稱:VisualStudio2010中Silverligh實現(xiàn)頁面動態(tài)裝配
文章分享:http://m.fisionsoft.com.cn/article/djchshs.html


咨詢
建站咨詢
