程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> MEF入門之不求甚解,但力求簡單能講明白(五),mef不求甚解

MEF入門之不求甚解,但力求簡單能講明白(五),mef不求甚解

編輯:C#入門知識

MEF入門之不求甚解,但力求簡單能講明白(五),mef不求甚解


我們已經成功的達到了目標,大量減少了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你已經入門了,再看大神們的文章心裡也有點底了。本系列到此結束。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved