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

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

編輯:C#入門知識

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


在上一篇文章中,我們已經學到了很基本的MEF概念和使用方法。

但我們導出的是一個object類型的實例,只能用來tostring,沒有引用部件類庫,也不能用裡面的成員方法。

本篇,我們逐漸往簡單的文件管理器的目標靠攏。

新建類庫IPart,添加一個接口IFileHandler.cs

namespace IPart
{
    public interface IFileHandler
    {
        void Process();
    }
}

Parts類庫和主項目meftest均引用IPart

Parts類庫中,將要導出的類型改為IFileHandler,類實現IFileHandler

以其中一個為例。

using IPart;
using System;
using System.ComponentModel.Composition;

namespace Parts
{
    [Export(typeof(IFileHandler))]//表示此類需要導出,導出的類型為IFileHandler
    public class TxtFileHandler: IFileHandler
    {
       public void Process()
        {
            Console.WriteLine("處理文本文件");
        }
    }
}

主項目:

using IPart;
using System;
using System.ComponentModel.Composition.Hosting;

namespace meftest
{
    class Program
    {
        //容器,裝東西用的。具體裝什麼先不管。
        private static CompositionContainer container;
        static void Main(string[] args)
        {
            //AssemblyCatalog 目錄的一種,表示在程序集中搜索
            var assemblyCatalog = new AssemblyCatalog(typeof(Program).Assembly);//此處這一句實際上沒啥用,因為此程序集下沒有任何我們需要的實例(各種handler)
            //在某個目錄下的dll中搜索。
            var directoryCatalog = new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory,"*.dll");
            var aggregateCatalog = new AggregateCatalog(assemblyCatalog, directoryCatalog);

            //創建搜索到的部件,放到容器中。
            container = new CompositionContainer(aggregateCatalog);        
            var exports = container.GetExports<IFileHandler>();//獲得所有導出的部件(IFileHandler類型的)。
            foreach (var item in exports)
            {
                item.Value.Process();//此處已經可以調用IFileHandler.Process()了
            }
            Console.ReadLine();
        }
    }
}

編譯後,別忘了把Parts.dll拷貝到主程序的bin\debug下。

運行:

我們已經把所有IHandler類型的實例創建出來了,並且運行了其中的成員函數。

 最恨天下文章一大抄,請不要轉載。

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