MEF核心筆記(2)Catalog的種類


一、內容回顧

清明時節雨紛紛啊,本打算回趟老家的,后來想想還是算了,人多,又下雨。閑話不多說了,上一篇中,我們了解了一些基本概念,如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類,並且覆寫掉基類的方法即可。

image

上圖是ComposablePartCatalog類中提供的方法,我們要實現自己的Catalog,必須要覆寫掉Parts屬性,如有特別需要處理的,我們還可以覆寫GetExports方法,此方法默認的調用了Parts屬性,進行進一步的輸出。

四、綜合示例

本次的示例依然很簡單,我們通過使用MEF提供的四種Catalog,來獲取Part,並且將獲取到的Part類型輸出到控制台中。解決方案如下:

image

其中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框架已經更新了很多內容,難免有所不同,這里只作為參考吧,畢竟只是學習筆記嘛!

源碼下載(訪問密碼:d121)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM