一、內容回顧
清明時節雨紛紛啊,本打算回趟老家的,后來想想還是算了,人多,又下雨。閑話不多說了,上一篇中,我們了解了一些基本概念,如Export、Import、Catalog等,本篇就Catalog,進行更加深入的講解。
二、框架中的Catalog
在MEF框架中,包含了4種Catalog,所有的Catalog的是從System.ComponentModel.Composition.Primitives名稱空間下的ComposablePartCatalog抽象類派生下來。
- AssemblyCatalog:表示從程序集中搜索部件的目錄。
- DirectoryCatalog:表示從文件系統的指定路徑中,搜索程序集,從而搜索部件。
- TypeCatalog:表示從指定的類型集合中,去搜索相應的部件。
- AggregateCatalog:聚合目錄,可以添加上面所說的所有目錄,從而進行多方面的部件搜索。
三、自定義Catalog
雖然MEF提供了4種Catalog已經能滿足我們很多需求,但也並非所有時候都盡如人意。如果無法滿足,我們可以通過自定義Catalog來完成我們所需要的部件搜索。
自定義Catalog和系統實現的Catalog類似,我們通過繼承System.ComponentModel.Composition.Primitives空間下的ComposablePartCatalog類,並且覆寫掉基類的方法即可。
上圖是ComposablePartCatalog類中提供的方法,我們要實現自己的Catalog,必須要覆寫掉Parts屬性,如有特別需要處理的,我們還可以覆寫GetExports方法,此方法默認的調用了Parts屬性,進行進一步的輸出。
四、綜合示例
本次的示例依然很簡單,我們通過使用MEF提供的四種Catalog,來獲取Part,並且將獲取到的Part類型輸出到控制台中。解決方案如下:
其中MEFParts為一個類庫項目,並且生成輸出路徑是在MEFApplication輸出路徑下的Parts目錄中,兩個項目的Classes文件中,我們都是很簡單的定義了沒有任何實現的類,然后輸出了object(即Export(typeof(object))),本次示例的Contract是object。
Classes中定義如下:
namespace MEFParts { [Export(typeof(object))] public class Class1 { } [Export(typeof(object))] public class Class2 { } [Export(typeof(object))] public class Class3 { } }
Program中,我們輸出了所有的Part,代碼如下:
namespace MEFApplication { class Program { private static MEF.CompositionContainer _container; static void Main(string[] args) { var assemblyCatalog = new MEF.AssemblyCatalog(typeof(Program).Assembly); var directoryCatalog = new MEF.DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory + "\\Parts", "*.dll"); var typeCatalog = new MEF.TypeCatalog(typeof(Class6), typeof(Class7)); var aggregateCatalog = new MEF.AggregateCatalog(assemblyCatalog, directoryCatalog, typeCatalog); _container = new MEF.CompositionContainer(aggregateCatalog); var exports = _container.GetExports<object>(); foreach (var exportValue in exports) { Console.WriteLine(exportValue.Value.GetType()); } Console.ReadLine(); } } }
其中:using MEF = System.ComponentModel.Composition.Hosting;
五、總結
本篇文章的內容依然很簡單,雖然簡單,但這是MEF中很核心的東西,所以單獨提出來。現在,我們熟悉了Catalog了,下一篇,我們開始說Export、Import。另外說一下,這系列的文章都是針對.NET Framework 4.0中自帶的,因為目前Codeplex上的MEF框架已經更新了很多內容,難免有所不同,這里只作為參考吧,畢竟只是學習筆記嘛!