我們已經成功的達到了目標,大量減少了if else。
不過在園子裡面的文章大多,用的是Import、ImportMany。So,修改主函數。
using IPart; using System; using System.Collections.Generic; using System.ComponentModel.Composition; using System.ComponentModel.Composition.Hosting; using System.Linq; namespace meftest { class Program { [ImportMany] private IEnumerable<Lazy<IFileHandler, IPatMetadata>> fileHandlers;//警告,說沒有賦值過。不用理會,MEF會自己導入的。 static void Main(string[] args) { //模擬數據。 string[] files = new string[] { @"c:\xxoo\xxoo.txt", @"c:\xxoo\ooxx.doc", @"d:\測試目錄\mm.jpg", @"e:\電影\天海翼.avi", }; Program p = new Program(); p.Compose(); foreach (var file in files) { string ext = System.IO.Path.GetExtension(file).ToLower(); var export = p.fileHandlers.SingleOrDefault(o => o.Metadata.Extension == ext);//根據擴展名,也就是元數據來找到對應的處理實例 if (export != null) export.Value.Process(file); } Console.ReadLine(); } private void Compose() { //AssemblyCatalog 目錄的一種,表示在程序集中搜索 var assemblyCatalog = new AssemblyCatalog(typeof(Program).Assembly);//此處這一句實際上沒啥用,因為此程序集下沒有任何我們需要的實例(各種handler) //在某個目錄下的dll中搜索。 var directoryCatalog = new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory, "*.dll"); var aggregateCatalog = new AggregateCatalog(assemblyCatalog, directoryCatalog);//聚合目錄包含有2種搜索方式 var container = new CompositionContainer(aggregateCatalog); container.ComposeParts(this);//將部件組合在一起。意思就是將所有Export的部件,裝配到this實例中標記為Import、ImportMany的屬性上。 } } }
不過這裡有一個要注意的地方,不能在主函數內部來進行裝配。原因如下圖。
運行結果:
ok,現在MEF你已經入門了,再看大神們的文章心裡也有點底了。本系列到此結束。