1. 基本概念:

    • Managed Extensibility Framework 或 MEF 是一个用于创建可扩展的轻型应用程序的库,在.NET 4.0发布
    • Container:容器,使用CompositionContainer类表示,使用目录提供的部件执行组合操作,即将导入绑定到导出
    • Catalog:目录,存放部件的地方,当需要某个部件时会在目录中寻找,可以作为目录的有type,assembly,directory
    • Part:部件,即实现契约的类
    • Import:导入,使用ImportAttribute进行修饰,可将某个对象声明为Import,可以修饰field,property,parameter等。每个导入都有一个契约,用于匹配对应的导出.可以修饰字段,属性或构造函数参数
    • Export:导出,导出契约的实现,对应一个Import,可以修饰类,字段,属性或者方法
    • Contract:契约,一种约定,代码中表现为接口或者抽象类
  2. 示意图:
  3. 示例代码:
     
    //契约 Contract
    public interface ICalculator
    {
    int Add(int a, int b);
    int Sub(int a, int b);
    } //此处我们导出了契约,这就是一个部件(Part)
    [Export(typeof(ICalculator))]
    public class DigitalCalculator : ICalculator
    {
    public int Add(int a, int b)
    {
    return a + b;
    } public int Sub(int a, int b)
    {
    return a - b;
    }
    } [TestClass]
    public class DigitalCalculatorTest
    {
    private CompositionContainer container; [Import(typeof(ICalculator))]
    public ICalculator calculator; public DigitalCalculatorTest()
    {
    //AssemblyCatalog 目录的一种,表示在相应的程序集中搜索
    AssemblyCatalog catalog = new AssemblyCatalog(typeof(DigitalCalculator).Assembly);
    container = new CompositionContainer(catalog); //组装部件,ComposeParts是扩展方法
    container.ComposeParts(this);
    } [TestMethod]
    public void Add_ReturnSum()
    {
    int x = , y = ;
    int actual = calculator.Add(x, y);
    int expected = ;
    Assert.AreEqual(expected, actual);
    } [TestMethod]
    public void Sub_ReturnDiff()
    {
    int x = , y = ;
    int actual = calculator.Sub(x, y);
    int expected = ;
    Assert.AreEqual(expected, actual);
    } }

最新文章

  1. 使用vlc进行二次开发做自己的播放器
  2. Java的Json解析包FastJson使用
  3. 1293. 3n+1数链问题 2016 12 23
  4. UnWind Segue
  5. 【C语言】17-预处理指令3-文件包含
  6. web 前端:连接mysql中文乱码问题的解决办法
  7. ubuntu无线上网静态ip配置以及配置静态IP 之后无法正常上网的解决方案
  8. JavaScript 数据类型转换(显式与隐式)
  9. ASP.NET内核几大对象、ASP.NET核心知识(7)--转载
  10. FZOJ2111:Min Number
  11. Linux命令不熟悉(记录)
  12. ABP+AdminLTE+Bootstrap Table权限管理系统第九节--AdminLTE模板页搭建
  13. SQL查询操作及子句优先级
  14. 256.Spring Boot+Spring Security: MD5是加密算法吗?
  15. JavaScript中的this所引用的对象和如何改变这个引用
  16. ListBox滚动条 刷新列表之后 指定位置(置顶或滚动到最后)
  17. DVWA的安装与简单使用
  18. topcoder srm 692 div1 -23
  19. Loadrunner 脚本录制策略
  20. Nginx的虚拟主机

热门文章

  1. CSS中alt和title属性的正确使用
  2. Python笔记(六)
  3. redis模拟消息订阅
  4. 修改WebAPI路由控制访问
  5. iOSUI显示思想
  6. spring-session与redis实现session共享
  7. Client初见——python
  8. jenkins 展示报告
  9. ZOJ 1081 Points Within( 判断点在多边形内外 )
  10. BZOJ 2754 [SCOI2012]喵星球上的点名 (AC自动机+map维护Trie树)