前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻。如果没有看过前面的文章,请到我的博客首页查看。

  前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要采用分层架构,就拿最简单的三层架构来说吧,我们通常把业务逻辑写在DLL中,现在就来写一个例子,看看如何在不编译整个项目的情况下,轻松的实现扩展。先透露一下,我们只要添加一个DLL就可以了。

  这里就以银行为例子吧,首先新建一个控制台项目,还叫MEFDemo吧,然后建一个类库写接口,然后再建一个类库实现接口。项目结构如下:

MEFDemo和BankOfChina都只引用接口项目,MEFDemo不需要引用BankOfChina。

BankInterface的代码如下,做个简单实例,写几个方法测试一下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace BankInterface
{public interface ICard{//账户金额double Money { get; set; }//获取账户信息string GetCountInfo();//存钱void SaveMoney(double money);//取钱void CheckOutMoney(double money);}
}

这里添加一个中国银行卡,实现接口,引用命名空间什么的不再重复说了,不懂看前面的文章,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BankInterface;
using System.ComponentModel.Composition;namespace BankOfChina
{[Export(typeof(ICard))]public class ZHCard : ICard{public string GetCountInfo(){return "Bank Of China";}public void SaveMoney(double money){this.Money += money;}public void CheckOutMoney(double money){this.Money -= money;}public double Money { get; set; }}
}

然后编写主程序,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using BankInterface;namespace MEFDemo
{class Program{[ImportMany(typeof(ICard))]public IEnumerable<ICard> cards { get; set; }static void Main(string[] args){Program pro = new Program();pro.Compose();

      foreach (var c in pro.cards)
      {
         Console.WriteLine(c.GetCountInfo());
      }

Console.Read();}private void Compose(){var catalog = new DirectoryCatalog("Cards");var container = new CompositionContainer(catalog);container.ComposeParts(this);}}
}

现在,我们知道只有一种银行卡,及中国银行的,注意我标红的代码,这里是一个目录,及主程序所在目录的Cards文件夹,我们把生成的BankOfChian.dll拷贝到这个文件夹下,然后运行才可以正确输出信息(毕竟我们没有引用那个项目),如图:

到了这里相信大家已经明白了,如果现在需求改变了,需要支持建行、农行等银行卡,怎么办呢?通常我们要改项目,把整个项目都编译再重新发布。但是现在不需要这么做了,我们只需要添加一个类库项目,把生成的dll拷贝到Cards目录下即可。

我们在这个解决方案下继续添加一个类库项目,实现ICard接口,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.Composition;
using BankInterface;namespace NongHang
{[Export(typeof(ICard))]public class NHCard : ICard{public string GetCountInfo(){return "Nong Ye Yin Hang";}public void SaveMoney(double money){this.Money += money;}public void CheckOutMoney(double money){this.Money -= money;}public double Money { get; set; }}
}

点击右键编译,把生成的dll拷贝到Cards目录下面,运行看到如下结果:

再看看Cards目录中,现在你添加几个dll,就会显示多少条信息了。

源码下载

MEF系列文章:

C#可扩展编程之MEF学习笔记(一):MEF简介及简单的Demo

C#可扩展编程之MEF学习笔记(二):MEF的导出(Export)和导入(Import)

C#可扩展编程之MEF学习笔记(三):导出类的方法和属性

C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻

C#可扩展编程之MEF学习笔记(五):MEF高级进阶

C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻相关推荐

  1. c# MEF框架(四 见证奇迹的时刻之实战应用)

    转自 http://www.cnblogs.com/yunfeifei/p/3940075.html 前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前 ...

  2. JSP学习笔记(四十九):抛弃POI,使用iText生成Word文档

    POI操作excel的确很优秀,操作word的功能却不敢令人恭维.我们可以利用iText生成rtf文档,扩展名使用doc即可. 使用iText生成rtf,除了iText的包外,还需要额外的一个支持rt ...

  3. 吴恩达《机器学习》学习笔记四——单变量线性回归(梯度下降法)代码

    吴恩达<机器学习>学习笔记四--单变量线性回归(梯度下降法)代码 一.问题介绍 二.解决过程及代码讲解 三.函数解释 1. pandas.read_csv()函数 2. DataFrame ...

  4. JavaScript学习笔记(四)(DOM)

    JavaScript学习笔记(四) DOM 一.DOM概述 二.元素对象 2.1 获取方式 (1).通过ID获取一个元素对象,如果没有返回null (2).通过`标签名`获取一组元素对象,,如果没有返 ...

  5. 华清远见fs4412开发板学习笔记(四)

    fs4412开发板学习笔记(四) 今天的课程安排 1.复习 1.1 VIM 编辑器 [1] vim + filename 打开 [2] 工作模式 命令模式 编辑模式 底行模式 [3] 模式切换 命令- ...

  6. 【http学习笔记四】安全篇

    [http学习笔记四]安全篇 文章目录 [http学习笔记四]安全篇 一.HTTPS 与 SSL/TLS ① 什么是安全? 机密性 完整性 身份认证 不可否认 ② 什么是HTTPS? ③ SSL/TL ...

  7. IOS学习笔记(四)之UITextField和UITextView控件学习

    IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...

  8. RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决)

    RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决) 参考文章: (1)RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决) (2)https://www.cnblogs. ...

  9. Ethernet/IP 学习笔记四

    Ethernet/IP 学习笔记四 EtherNet/IP Quick Start for Vendors Handbook (PUB213R0): https://www.odva.org/Port ...

最新文章

  1. IDC发布制造业预测,AI风险决策因何上榜?
  2. C语言逆序字符串(递归实现)
  3. 【开源项目】基于FFmpeg的RGB格式封装MOV文件
  4. 95-136-041-源码-Operator-AbstractStreamOperator
  5. 技术小故事-Activity的Launch Mode引起的动画“疑案”
  6. Bailian3710 有多少位不同【位运算】
  7. docker compose安装_docker stack,docker-compose前世今生
  8. Excel VBA 统分
  9. 使用H5编写网页版象棋(源码)
  10. python 倒计时库_python实现倒计时小工具
  11. 求职面试准备——自我介绍
  12. 【JTT1078视频服务器】之音视频的拆解
  13. C语言-流程控制-输出华氏-摄氏温度转换表
  14. 6月3日至5日 服务器信息维修,2015年6月3日维护公告
  15. sublime Mac版怎么安装? Mac下载安装sublime的教程
  16. hihoCoder-1633 ACM-ICPC北京赛区2017 G.Liaoning Ship’s Voyage 线段与三角形规范相交
  17. (全)Word Embedding
  18. 对载荷谱进行雨流计数的几个主要步骤(以四点雨流计数为例)
  19. 摆脱冷气_让您摆脱开发人员的障碍‍
  20. 从瞳孔的扩张收缩提取大脑EEG的delta,theta,alpha,beta,gamma等信号信息

热门文章

  1. 制定灾难恢复计划时易忽略的九件事
  2. [译] 新一代 JavaScript 的开发图谱(2017)
  3. Unity 打包发布Android新手教学 (小白都能看懂的教学 ) [转]
  4. Android NDK开发-3-环境搭建
  5. MyBatis+Spring整合
  6. mac 环境下 制作windows系统U盘启动盘
  7. iOS UIWebView 访问https 绕过证书验证的方法
  8. ibatis example Class 使用
  9. web前端环境搭建以及vue-cli搭建启动vue项目
  10. Redis的字典扩容与ConcurrentHashMap的扩容策略比较