在上一篇文章中,我們已經學到了很基本的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類型的實例創建出來了,並且運行了其中的成員函數。
最恨天下文章一大抄,請不要轉載。