亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

如何用 MEF 擴展應用程序

2019-11-17 03:11:03
字體:
來源:轉載
供稿:網友

如何用 MEF 擴展應用程序

  最近在寫一篇關于如何擴展 Visual Studio 編輯器的文章時,用到了 MEF,因此打算寫一篇文章提一下這個技術點。本篇文章并不打算詳細介紹 MEF,只是一個最簡單的入門,相信您在閱讀本篇文章后,可以迅速開發出一個可擴展的應用程序。

簡 介

  MEF(Managed Extensibility Framework),是微軟推出的一款用于搭建可擴展應用程序的框架,起初是獨立于 .Net 發布的,后來集成到了 .Net 4.0 中。使用該框架可以非常輕松地擴展一個已發布的應用程序的功能,連 Visual Studio IDE 中的代碼編輯器窗口也采用了MEF的思想,因此大大方便了開發人員對編輯器的擴展。

  MEF 可用在任何使用 .NET Framework 的地方。可以在客戶端應用程序中使用 MEF(無論應用程序使用的是 Windows 窗體、WPF,還是任何其他技術),也可以在使用 asp.net 的服務器應用程序中使用 MEF。

MEF的關鍵概念

  Import

  導入,這里建議作為一個名詞來理解,即一個接受者,它可以接受外來的東東。就好比是下圖中的盒子,它可以接受其它積木。

十三孔智力盒

  Export

  導出,同樣建議以一個名詞來理解,即一個第三方的產物。它就像上圖中不同顏色的積木,這些積木不屬于這個盒子,但是能被放入盒子中,來豐富盒子的功能。

積木

  Contract

  協議。要想使盒子能接受積木(比如,圓柱體只能放入圓形的接口中),那這些積木必須符合一定的形狀。而這些形狀就相當于是應用程序和第三方擴展之間的一個協議。

  Compose

  組合(動詞),即將多個符合協議要求的部件組合在一起,構成一個功能豐富的應用程序。就好比是將不同形狀的積木,按照接口的形狀組合在一起。

它是如何工作的?

  MEF 會動態查找用戶所指定的目錄,如果發現該目錄中的程序集滿足協議要求,就會啟動自身的組合引擎,然后根據不同的協議約定把這些擴展導入到應用程序內部。

用 MEF 實現一個最簡單的可擴展應用程序

  對幾個關鍵的概念清楚了之后,我們就可以開始實踐了。最終的效果是窗體上會動態加載某一目錄下的dll,并自動為每個新功能添加一個按鈕,當點擊按鈕就會執行新的功能。

最終效果

  首先,定義一個協議。

  這個和普通定義接口沒什么兩樣。

1     public interface iplugin2     {3         string Text { get; }4  5         void Do();6     }

  安裝接受者

  有了協議之后,就需要給應用程序安一個接受者。讓這個應用程序可以通過接受者來獲取第三方擴展。MEF 提供了[Import][ImportMany]兩種 attribute。 區別就是 Import 只能接受符合協議的一個擴展,而 ImportMany 可以接受多個,并把多個擴展放入集合中。

 1     public partial class Form1 : Form 2     { 3         public Form1() 4         { 5             InitializeComponent(); 6         } 7   8         [ImportMany] 9         public IEnumerable<IPlugin> plugins;10  11         PRivate void Form1_Load(object sender, EventArgs e)12         {13         }14  15     }

  提供一個符合協議的產物

  這個產物的生產過程其實就是實現接口的過程,唯一的區別是我們要為這個實現打上個標簽,從而告訴我們的組合引擎這個東西是給接受者的。MEF 提供了 Export 來暗示這是一個可以提供給接受者的產物。

 1     [Export(typeof(IPlugin))] 2     public class MyPlugin:IPlugin 3     { 4         public string Text 5         { 6             get 7             { 8                 return "This is a demo"; 9             }10         }11  12         public void Do()13         {14             MessageBox.Show(Text);15         }16     }

  發動引擎

  萬事俱備,就差發動了。前面說了引擎的主要作用就是把發現擴展,同時把這些擴展組合到應用程序中。

 1 private CompositionContainer _container; 2 private void Init() 3 { 4     try 5     { 6         MyPlugin my = new MyPlugin(); 7         this._container.ComposeParts(this, my);//把擴展和實例組合在一起 8     } 9     catch (CompositionException compositionException)10     {11         Console.WriteLine(compositionException.ToString());12     }13 }

  上面的代碼雖然實現了組合的功能,但是卻硬把產物給編碼進去了。要是每次開發了新的擴展,都得這樣修改應用程序代碼,那就完全沒有使用MEF的必要了,而且也違反了開放封閉的設計原則。

  把上面的代碼改一改。

 1 private CompositionContainer _container; 2 private void Init() 3 { 4     //設置目錄,讓引擎能自動去發現新的擴展 5     var catalog = new AggregateCatalog(); 6     catalog.Catalogs.Add(new DirectoryCatalog("D://plugin//")); 7   8     //創建一個容器,相當于是生產車間 9     _container = new CompositionContainer(catalog);10  11     //調用車間的ComposeParts把各個部件組合到一起12     try13     {14         this._container.ComposeParts(this);//這里只需要傳入當前應用程序實例就可以了,其它部分會自動發現并組裝15     }16     catch (CompositionException compositionException)17     {18         Console.WriteLine(compositionException.ToString());19     }20 }

  上面的代碼會自動去發現擴展,然后加入到應用程序中來。你要做的只是把新擴展的程序集放入 D://plugin 目錄中就可以了。是不是很方便呢?

參考資源

  Managed Extensibility Framework (MEF)

  本文源代碼下載

本文來源于 《如何用 MEF 擴展應用程序》


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲一区二区三区视频播放| 在线播放亚洲激情| 日韩视频在线免费| 欧美一区二区三区免费视| 久久精品99国产精品酒店日本| 久久精品久久久久电影| 26uuu另类亚洲欧美日本老年| 欧美精品一区在线播放| 欧美精品久久久久久久久| 亚洲已满18点击进入在线看片| 久久精品人人做人人爽| 欧美色视频日本版| 久久久久亚洲精品国产| 欧美国产日韩一区二区在线观看| 久久99视频精品| 欧美亚洲免费电影| 欧美专区中文字幕| 亚洲视频axxx| 亚洲欧美精品伊人久久| 亚洲变态欧美另类捆绑| 日韩av观看网址| 好吊成人免视频| 91精品国产综合久久久久久久久| 欧美激情中文字幕在线| 孩xxxx性bbbb欧美| 国产日韩欧美黄色| 美女少妇精品视频| 日韩中文字幕在线播放| 国产精品久久久久久搜索| 日日噜噜噜夜夜爽亚洲精品| 国产精品久久久久久久一区探花| 国内外成人免费激情在线视频网站| 久久免费视频在线观看| 久久av在线播放| 国产亚洲欧美日韩美女| 国产精品伦子伦免费视频| 精品欧美一区二区三区| 亚洲国产天堂久久综合| 国产91ⅴ在线精品免费观看| 欧美劲爆第一页| 久久久久久久久久久人体| 久久久久久久久久亚洲| 欧美国产日韩精品| 社区色欧美激情 | 精品久久久精品| yellow中文字幕久久| 韩国精品美女www爽爽爽视频| 久久成人精品视频| 成人欧美一区二区三区在线湿哒哒| 欧美亚洲国产日本| 亚洲区免费影片| 国产日韩欧美黄色| 在线视频日本亚洲性| 国产日韩av在线| 欧美www在线| 亚洲精品欧美一区二区三区| 欧美夫妻性生活xx| 2019中文在线观看| 国产精品伦子伦免费视频| 国产精品久久77777| 国产在线观看精品| 国产亚洲视频在线观看| 一区二区三区国产视频| 日韩精品日韩在线观看| 国产精品一区二区久久久久| 成人免费在线网址| 亚洲成人网av| 精品女同一区二区三区在线播放| 秋霞成人午夜鲁丝一区二区三区| 欧美激情va永久在线播放| 91色在线观看| 国产一区二区在线免费| 欧美亚洲激情在线| 日韩在线国产精品| 亚洲精品国产精品国产自| 久久久精品一区二区| 91精品国产自产在线老师啪| 久久精品99无色码中文字幕| 日韩在线精品视频| 久久亚洲成人精品| 国产精品视频男人的天堂| 狠狠色噜噜狠狠狠狠97| 欧美大全免费观看电视剧大泉洋| 欧美高清在线播放| 亚洲人成在线观| 蜜月aⅴ免费一区二区三区| xx视频.9999.com| 久久影视三级福利片| 亚洲午夜小视频| 日韩**中文字幕毛片| 亚洲国产古装精品网站| 国产精品xxxxx| 91国在线精品国内播放| 欧美重口另类videos人妖| 亚洲第五色综合网| 高清在线视频日韩欧美| 高清在线视频日韩欧美| 26uuu亚洲伊人春色| 亚洲国产精品va在线看黑人| 久久久精品在线观看| 日韩美女毛茸茸| 国产一区二区三区视频免费| 亚洲影影院av| 日韩av在线不卡| 亚洲aa在线观看| 91在线高清免费观看| 亚洲成色www8888| 亚洲欧美激情在线视频| 国产精品老牛影院在线观看| 国产成人精品久久二区二区91| 欧美高清不卡在线| 姬川优奈aav一区二区| 亚洲aⅴ男人的天堂在线观看| 欧美色视频日本高清在线观看| 欧美日韩精品国产| 国产精选久久久久久| 欧美激情一区二区久久久| 成人在线激情视频| 国产精品久久久久久久久久久新郎| 欧美亚洲另类在线| 国内精品久久久久久久| 亚洲视频电影图片偷拍一区| 欧美成人国产va精品日本一级| 亚洲国产精品福利| xvideos成人免费中文版| 欧美一区二区大胆人体摄影专业网站| 国产精品成人播放| 亚洲精品suv精品一区二区| 国产欧美日韩中文字幕| 色综合久久88色综合天天看泰| 国产偷国产偷亚洲清高网站| 欧美日韩国产成人在线| 欧美人与性动交a欧美精品| 亚洲欧美另类在线观看| 69视频在线免费观看| 丝袜亚洲欧美日韩综合| 91高潮精品免费porn| 91色在线观看| 亚洲国产婷婷香蕉久久久久久| 按摩亚洲人久久| 欧美野外wwwxxx| 97国产在线视频| 欧美电影免费观看高清| 尤物99国产成人精品视频| 亚洲va电影大全| 欧美激情在线一区| 91精品久久久久久久久| 欧美成人精品激情在线观看| 青青久久av北条麻妃黑人| 国产精品专区第二| 日韩精品视频在线| 欧美高清视频免费观看| 成人日韩av在线| 91九色国产社区在线观看| 亚洲黄色www网站| 亚洲精品美女在线观看播放| 中文字幕国内精品| 国产精品一区二区电影| 91精品国产精品| 国产精品久久久久久久久久新婚| 国产精品激情av在线播放| 欧美色道久久88综合亚洲精品| 国产91精品久久久久久| 青青在线视频一区二区三区|