[MEF] 学习之一 入门级的简单Demo
MEF 的精髓在于插件式开发,方便扩展。
我学东西,习惯性的先搞的最简单的Demo出来,看看有没有好玩的东东,然后继续深入。这个博文,不谈大道理,看demo说事儿。
至于概念,请google ,大把大把的。
例如,应用程序的日志输出到文本,后来想改为输出到数据库,按照传统的办法,需要替换项目,删除原有的引用,增加新的引用;如果使用MEF,直接用新的dll替换原来的dll,即可搞定,这就是MEF的魅力。
下面就用简单的例子来实现上述的需求。
1. 建立一个解决方案,然后增加如下的几个项目
Dblog 输出日志到数据库的实现
TextLog 输出日志到文本的实现
Ilog 输出日志的接口,调用方和实现者的中间桥梁
MEFConsoleHost 控制台应用程序,模拟实用场合
MEFWPFHost WPF 应用程序,模拟实用场合
2. 先定义接口Ilog,非常简单,就一个方法
3. 输出到文本的实现TextLog
首先添加引用:引用刚才添加的接口Ilog 和System.ComponentModel.Composition
然后增加类TextLogService.cs,继承接口,并实现方法。
注意 类和方法都Public。
最后定义导出[Export(typeof(ILog.ILogService))]
这个是最主要的,和普通的类库区别也在这里
4. 输出到数据库的实现DbLog,实现方法同上例,输出日志的时候区分一下。
5. 调用方MEFConsoleHost, 这个也需要增加两个引用,
Ilog 和System.ComponentModel.Composition
主程序代码如下:
class Program { [Import(typeof(ILogService))] public ILogService CurrentLogService { get; set; } static void Main(string[] args) { Program pro = new Program(); pro.Run(); } void Run() { //var catalog = new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory,"DbLog.dll"); var catalog = new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory, "TextLog.dll"); var container = new CompositionContainer(catalog); container.ComposeParts(this); CurrentLogService.Log("MEF Log Test Pass"); Console.Read(); } }
注意两个地方
a. 导入声明
[Import(typeof(ILogService))]
public ILogService CurrentLogService { get; set; }
用接口来定义实例,然后增加导入声明,和导出的相互对应
b. 建立Catalog和Container
var catalog = new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory, "TextLog.dll");
var container = new CompositionContainer(catalog);
container.ComposeParts(this);
先这么写,随后再深入挖掘。
6. 把所有项目的输出都指定到同一个目录,也就说让dll和exe在同一目录,运行控制台程序,输出
TextLog: MEF Log Test Pass
7.如果我们要输出到数据库,把上面的catalog那一句改成
var catalog = new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory,"DbLog.dll");
如果不想这么麻烦,这个目录里面只放DbLog.dll 或者TextLog.dll ,然后把上面那句改为:
var catalog = new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory);
照样可以用。
如果两个都在,还这么搞,那不行的,因为就定义了一个实例,同目录有两个dll。
好了,入门的Demo就到这里。
可以延伸开来,触类旁通,继续深入研究其他概念,例如其他的Catalog\Export等。
文章来源:http://www.cnblogs.com/xiaokang088/archive/2012/02/21/2361631.html
相关源代码下载:http://pan.baidu.com/s/1i3kPSlZ 密码:nj9m
[MEF] 学习之一 入门级的简单Demo的更多相关文章
- [MEF] 学习之一 入门级的简单Demo(转)
MEF 的精髓在于插件式开发,方便扩展. 我学东西,习惯性的先搞的最简单的Demo出来,看看有没有好玩的东东,然后继续深入.这个博文,不谈大道理,看demo说事儿. 至于概念,请google ,大把大 ...
- C#可扩展编程之MEF学习笔记(一):MEF简介及简单的Demo
在文章开始之前,首先简单介绍一下什么是MEF,MEF,全称Managed Extensibility Framework(托管可扩展框架).单从名字我们不难发现:MEF是专门致力于解决扩展性问题的框架 ...
- PHP多进程学习(一)__来初步了解一下PHP多进程及简单demo
php是一门单进程弱类型的语言,PHP处理多并发主要是依赖服务器或PHP-FPM的多进程及它们进程的复用,多进程的作用优点大家可以去网上了解,PHP实现多进程在实际项目中意义也是不容小觑的.比如:日常 ...
- C#可扩展编程之MEF学习笔记(五):MEF高级进阶
好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...
- C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻
前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...
- C#可扩展编程之MEF学习笔记(三):导出类的方法和属性
前面说完了导入和导出的几种方法,如果大家细心的话会注意到前面我们导出的都是类,那么方法和属性能不能导出呢???答案是肯定的,下面就来说下MEF是如何导出方法和属性的. 还是前面的代码,第二篇中已经提供 ...
- C#可扩展编程之MEF学习笔记(二):MEF的导出(Export)和导入(Import)
上一篇学习完了MEF的基础知识,编写了一个简单的DEMO,接下来接着上篇的内容继续学习,如果没有看过上一篇的内容, 请阅读:http://www.cnblogs.com/yunfeifei/p/392 ...
- C#可扩展编程之MEF学习
MEF系列文章: C#可扩展编程之MEF学习笔记(一):MEF简介及简单的Demo C#可扩展编程之MEF学习笔记(二):MEF的导出(Export)和导入(Import) C#可扩展编程之MEF学习 ...
- [转]MEF学习
MEF学习 :http://www.cnblogs.com/comsokey/p/MEF1.html C#可扩展编程之MEF学习笔记(一):MEF简介及简单的Demo C#可扩展编程之MEF学习笔记( ...
随机推荐
- 阿里巴巴 DevOps 转型后的运维平台建设
原文:http://www.sohu.com/a/156724220_262549 本文转载自公众号「DevOps 时代」,高效运维社区致力于陪伴您的职业生涯,与您一起愉快的成长. 作者简介: 陈喻( ...
- VS2012 未找到与约束ContractName Microsoft.VisualStudio.Text.ITextDocumentFactoryService 未找到与约束ContractName,无法打开项目的解决方案 SQLyog 注册码
VS2012 未找到与约束ContractName Microsoft.VisualStudio.Text.ITextDocumentFactoryService 最近新换了系统还真是问题多多呀! ...
- [转] 查看HDFS文件系统数据的三种方法
1.使用插件——Hadoop-Eclipse-Plugin此方法需要借助Eclipse,插件的安装及使用请参考博文使用Eclipse编译运行MapReduce程序_Hadoop2.6.0_Ubuntu ...
- 更改 Nginx 服务的默认用户
为什么要更改 Nginx 服务的默认用户:就像更改 ssh 的默认 22 端口一样,增加安全性,Nginx 服务的默认用户是 nobody ,我们更改为 nginx 1.添加 nginx 用户 use ...
- 简易web服务器(java版)
//直接使用 ServerSocket 监听服务器端口,就能实现web服务器package ThreadPoolTest; import java.io.InputStream; import jav ...
- 今天学习Ibatis,花了我一个下午的时间,程序猿呀,你上点心吧
今天花了半天的时间完成了一个小小小的项目 烦了两个错误:第一个没有对Dao层进行实例化, 第二个错误是: 给数据表其错了名字,现在很混乱呀 不能其Content相似的名字呀! 还是等心情平复了再写日记 ...
- MapReudce源码分析之Mapper
Mapper是MapReduce编程模型中一个将输入的key/value对映射成一组中间key/value对的组件.Map是将输入记录转换成中间记录的单个任务.被转换的中间记录不需要与输入记录一样的类 ...
- 《TomCat与Java Web开发技术详解》(第二版) 第三章节的学习总结--利用Context元素来自定义web应用的存储位置
在学习完第三章后(第三章提供的web应用是helloaapp,我将其放到了tomcat/webapps中),对Context元素的作用理解不深:但是当进入第四章后,发现第四章提供的源码包中也有一个叫h ...
- 在Ubuntu下编译FFmpeg
第一步:准备编译环境 .tar.bz2 -2245/ ./configure --enable-static--enable-shared--prefix=/usr/localmakesudomake ...
- JSP开发中的基础语法
JSP 语法 JSP开发中的基础语法. 脚本程序 脚本程序可以包含任意量的Java语句.变量.方法或表达式,只要它们在脚本语言中是有效的. 脚本程序的语法格式: <% 代码片段 %> 或者 ...