zoukankan      html  css  js  c++  java
  • MEF基本概念

    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. 示意图:
      clipboard
    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 = 3, y = 2;
                  int actual = calculator.Add(x, y);
                  int expected = 5;
                  Assert.AreEqual(expected, actual);
              }
      
              [TestMethod]
              public void Sub_ReturnDiff()
              {
                  int x = 3, y = 2;
                  int actual = calculator.Sub(x, y);
                  int expected = 1;
                  Assert.AreEqual(expected, actual);
              }
      
          }
  • 相关阅读:
    TinySpider开源喽
    TinyXmlParser开源喽
    Tiny快速入门之控制层开发
    TinyDBRouter
    TinyIOC
    开源前要做好哪些准备工作?
    分布式锁的简单实现
    TinyDBCluster Vs routing4db
    HTML5基础(五)
    HTML5基础(四)
  • 原文地址:https://www.cnblogs.com/phenixyu/p/3965230.html
Copyright © 2011-2022 走看看