MEF入门之不求甚解,但力求简单能讲明白(二)
2016-05-29 21:12
246 查看
在上一篇文章中,我们已经学到了很基本的MEF概念和使用方法。
但我们导出的是一个object类型的实例,只能用来tostring,没有引用部件类库,也不能用里面的成员方法。
本篇,我们逐渐往简单的文件管理器的目标靠拢。
新建类库IPart,添加一个接口IFileHandler.cs
Parts类库和主项目meftest均引用IPart
Parts类库中,将要导出的类型改为IFileHandler,类实现IFileHandler
以其中一个为例。
主项目:
编译后,别忘了把Parts.dll拷贝到主程序的bin\debug下。
运行:
我们已经把所有IHandler类型的实例创建出来了,并且运行了其中的成员函数。
最恨天下文章一大抄,请不要转载。
但我们导出的是一个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类型的实例创建出来了,并且运行了其中的成员函数。
最恨天下文章一大抄,请不要转载。
相关文章推荐
- 学习进度表第十三周
- Angular JS 跨域
- JAVA WEB开发笔记
- c++多态
- 前端面试题整理【转】
- Python学习 (字符串细讲)
- 【DAY12】第十二天集合&泛型&IO学习笔记
- maven 详解
- C++走向远洋——58(项目二3、动物这样叫、改进版)
- java枚举:初学(2)
- pojFinancial Management1004
- U盘修复的一点小实践
- 多线程
- cojs QAQ的矩阵 题解报告
- 1445 送Q币
- 附3 springboot源码解析 - 构建SpringApplication
- 混合使用ForkJoin+Actor+Future实现一千万个不重复整数的排序(Scala示例)
- 第二阶段冲刺(第三天)
- html5 模块
- 面向对象