哨兵

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  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);
            }
    
        }
posted on 2014-09-10 21:48  哨兵  阅读(594)  评论(0编辑  收藏  举报