转自 http://www.cnblogs.com/yunfeifei/p/3940075.html

前面三篇讲了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,就会显示多少条信息了。

c# MEF框架(四 见证奇迹的时刻之实战应用)相关推荐

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

    前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...

  2. 见证奇迹的时刻到了 魔兽世界 引爆新闻出版署VS文化部

    分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow 刚刚发现,关于网易 ...

  3. 见证奇迹的时刻:让你的头像说话

    大家好,我是你们的章鱼猫. 之前我们分享过 deepfake 相关的项目,通过机器学习的方法对视频中的人物进行换脸,一经推出后被坏人利用了,走向了其作恶的一面,当然目前这些项目都被 GitHub 封禁 ...

  4. 代码补全快餐教程(1) - 30行代码见证奇迹

    代码补全快餐教程(1) - 30行代码见证奇迹 下面是我用30多行代码,包含了很多空行和注释的代码写成的代码补全模型.我们先看看效果吧. 补全效果案例 先来看个比较普通的(Python, Keras) ...

  5. 【C#进阶系列】【MEF框架(一)】

    C#进阶系列 第一章 [C#进阶系列][MEF框架(一)] 文章目录 C#进阶系列 前言 一.MEF介绍 二.为什么要用MEF 三.MEF的概念 四.使用示例 五.MEF框架的好处 六.源码链接 总结 ...

  6. 胖虎谈ImageLoader框架(四)

    前言 从学校出来的这半年时间,发现很少有时间可以静下来学习和写博文了,为了保持着学习热情,我希望自己抽出一部分时间来写一些Android框架源码阅读后的理解系列博文. 期许:希望可以和大家一起学习好此 ...

  7. 视频教程-WebGL 可视化3D绘图框架:Three.js 零基础上手实战-其他

    WebGL 可视化3D绘图框架:Three.js 零基础上手实战 网名风舞烟,中国科技大学计算机专业.微软认证讲师(MCE).微软数据分析讲师.10多年软件行业从业经验,参与过数百万的企业级ERP系统 ...

  8. 里面使用轮播_小程序ColorUI框架初步使用教程及个人项目实战

    小程序ColorUI框架初步使用教程及个人项目实战 最近在写自己的一个微信小程序项目<阿涛技术博客>,目前还在写前端小程序部分,之前我有用过小Weiui,Linui等微信小程序UI框架,在 ...

  9. 43.深度解密四十三:网络营销推广实战中的“辅助营销工具”大全

    网络营销推广技术.技巧深度解密(四十三)指南: 1.本文档适合零基础以及互联网营销推广工作者,主要讲解网络营销需要的相关辅助营销工具的问题. 2.原创版权文档,任何抄袭或者全部.部分模仿都是侵权行为. ...

最新文章

  1. hdu 5713(状态压缩DP)
  2. JUC 中的多线程协作工具类:CountDownLatch 和 CyclicBarrier
  3. 前端教程丨手把手教你用 Next.js 搭建个人博客,从入门到吃鸡
  4. UVa10410 Tree Reconstruction(bfs+dfs确定二叉树)
  5. 可持久化线段树学习笔记
  6. matlab窗函数带通滤波器,Matlab结合窗函数法设计数字带通FIR滤波器
  7. Unreal Engine 4 基于网格的水面模拟实现
  8. oa中获取当前用户信息
  9. 新出的计算机语言,新编程语言是鸡肋?听听创始人们怎么说
  10. 瑞星系统中心服务器地址如何修改,瑞星系统中心安装教程
  11. 力扣14最长公共子串
  12. SpringBoot快速开始magic-api基础
  13. 搜狐狐友与腾讯微信两款社交软件的比较
  14. Mac Spotlight 聚焦搜索
  15. ubuntu 18.04 安装NVIDIA驱动 cuda/cudnn + tensorflow-gpu + pytorch
  16. codeforces csp复赛训练利器---初识
  17. windows服务程序一
  18. Linux find 实战
  19. Java实现生成可跳转指定页面的二维码
  20. Python中 and 和 or 运算短路逻辑

热门文章

  1. c语言case接收字符,switch-case-break:字符释义 | 新思维:C语言程序设计
  2. hbuilder边框代码是什么_看懂HTML代码,摸清国外买家喜欢搜什么关键词
  3. python绘制动态图表怎么存下来_做动态图表,没有数据?用Python就能获取!
  4. manifest php,Laravel PackageManifest.php: Undefined index: name
  5. 在HTML标签中 lt h5 gt 表示,HTML lt;blockquotegt; 标签
  6. JAVA构架之并发编程的一些总结
  7. vm虚拟机安装包_一次Miniconda虚拟机安装的神奇踩坑记录
  8. python继承super函数_Python中的super函数如何实现继承?
  9. 武汉大学信息管理学院java上机考试_java上机试题
  10. 服务器具有挂起的重新启动_ESP8266与网络服务器实时通讯