MEF

  1. 基本概念:

    • Managed Extensibility Framework 或 MEF 是一个用于创建可扩展的轻型应用程序的库,在.NET 4.0发布

    • Container:容器,使用CompositionContainer类表示,存放目录(Catalog)并进行管理,如导入,导出
    • 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);
    }
    //此处我们导出了契约,这就是一个部件
       [Export(typeof(ICalculator))]
       public class MyCalculator : ICalculator {
    
           public int Add(int a, int b) {
               Console.WriteLine("Add Invoked");
               return a + b;
           }
    
           public int Sub(int a, int b) {
               Console.WriteLine("Sub Invoked");
               return a - b;
           }
       }
    //此处我们导出了契约,这就是一个部件
       [Export(typeof(ICalculator))]
       public class MyCalculator : ICalculator {
    
           public int Add(int a, int b) {
               Console.WriteLine("Add Invoked");
               return a + b;
           }
    
           public int Sub(int a, int b) {
               Console.WriteLine("Sub Invoked");
               return a - b;
           }
       }
      class Program {
    
        private static CompositionContainer _container;
        static void Main(string[] args) {
            //AssemblyCatalog 目录的一种,表示在相应的程序集中搜索
            var catalog = new AssemblyCatalog(typeof(Program).Assembly);
            _container = new CompositionContainer(catalog);
    
            MathCompute mathCompute = new MathCompute();
            _container.ComposeParts(mathCompute);//组装部件
    
            Console.WriteLine(mathCompute.Add(1, 3));
            Console.WriteLine(mathCompute.Sub(3, 2));
    
            Console.ReadLine();
        }
    }
    
    
时间: 2024-08-26 01:55:50

MEF的相关文章

C# 使用MEF动态加载不同的userControl,并实现不同userControl之间通信

1. 首先在项目的引用中添加:System.ComponentModel.Composition和bbv.Common.EventBroker 其中bbv.Common.EventBroker引用的dll库在http://sourceforge.net/projects/bbvcommon/中可以下载,如果获取不到,可以留言与我,我提供给大家.如图所示: 2.具体代码实现 1).主窗体代码: public partial class frmMain : Form { private void i

[MEF]第03篇 MEF延迟加载导出部件及元数据

一.演示概述 此演示介绍了MEF的延迟加载及元数据相关的内容. 在实际的设计开发中,存在着某些对象是不需要在系统运行或者附属对象初始化的时候进行实例化的, 只需要在使用到它的时候才会进行实例化,这种方式就可以理解为对象的迟延初始化,或者叫迟延加载. 对于提升系统的性能大有裨益呀! 另外,还可以为导出的部件添加元数据,以便在代码中提供更加灵活的扩展办法,或获取更多的相关信息.甚至,还可以自定义元数据的接口,无论是定义还是使用都非常的方便. 相关下载(屏幕录像):http://yunpan.cn/c

MEF实现设计上的“松耦合”(一)

1.什么是MEF 先来看msdn上面的解释:MEF(Managed Extensibility Framework)是一个用于创建可扩展的轻型应用程序的库. 应用程序开发人员可利用该库发现并使用扩展,而无需进行配置. 扩展开发人员还可以利用该库轻松地封装代码,避免生成脆弱的硬依赖项. 通过 MEF,不仅可以在应用程序内重用扩展,还可以在应用程序之间重用扩展. 也有人把MEF解释为“依赖注入”的一种方式,那么什么是“依赖注入”?如果这样解释,感觉越陷越深......根据博主的理解,了解MEF只需要

实战MEF(1)

在过去,我们完成一套应用程序后,如果后面对其功能进行了扩展或修整,往往需要重新编译代码生成新的应用程序,然后再覆盖原来的程序.这样的扩展方式对于较小的或者不经常扩展和更新的应用程序来说是可以接受的,而对于像ERP系统那样复杂而且常常需要扩展的应用程序,这种扩展方法就不够方便,因为每次都要修改源代码或重新引用组件. 尤其是组件(许多dll),如果每编写一个新组件又要在主项目中引用一次,显然主项目就不得不经常重新生成.要是能有一种机制,可以在主项目应用程序不作任何修改就可以自动识别并扩展组件,就会很

MEF实现设计上的“松耦合”(二)

介绍了下MEF的基础用法,让我们对MEF有了一个抽象的认识.当然MEF的用法可能不限于此,比如MEF的目录服务.目录筛选.重组部件等高级应用在这里就不做过多讲解,因为博主觉得这些用法只有在某些特定的环境下面才会用到,着实不太普遍,感觉没有钻下去的必要.如果你有兴趣也可以去了解下.这篇打算将MEF和仓储模式结合起来谈谈MEF在项目中的使用. 1.仓储模式:也叫Repository模式.Repository是一个独立的层,介于领域层与数据映射层(数据访问层)之间.它的存在让领域层感觉不到数据访问层的

在.NET Core中使用MEF

(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:微软的可托管扩展框架也移植到.NET Core上了. 可托管扩展框架(Managed Extensibility Framework,MEF)是微软为大型应用程序(比如Visual Studio这样的东西)提供的一个功能扩展框架,通过一个混合层提升了灵活性.维护性和可测试性.MEF既可以用于第三方插件支持扩展功能(我曾经开发的eBalance就是使用MEF实现插件功能),也能为常见的应用程序带

Adding an instance to a MEF container

How can you add an already created instance to a MEF container/cataloge to use when resolving Imports. I want the functionality that Unity gives with the RegisterInstance method on its containers. You can use the ComposeExportedValue function for thi

[MEF]第05篇 MEF的目录(Catalog)筛选

一.演示概述 本示例演示如何使用MEF提供的目录(Catalog)的扩展机制实现可过滤导出部件的自定义目录类.主要是通过继承ComposablePartCatalog基类,并实现接口INotifyComposablePartCatalogChanged来完成的. 相关下载(屏幕录像):http://yunpan.cn/cVkvuUNfuDtTX  访问密码 567d 温馨提示:如果屏幕录像和代码不能正常下载,可站内留言,或发邮件到[email protected] 欢迎有兴趣研究.NET相关技术

MEF的学习笔记

为什么要使用MEF 在商业应用软件开发过程中,对于各个软件项目,都需要建立相应的系统框架,为了更好的规范系统的开发,提高生产效率,应该在公司级别制定相应的API标准.这些API标准将站在系统架构层次,以同样一个核心框架构建出不同的商业应用. 对于各个商业应用中存在花样繁多的需求,同时又存在一些公用的模块,为了将这些可变的和相对稳定的功能模块有机的整合在一个系统框架下,那么就需要实现系统框架的可自定义插件开发.目前在MEF之前,业界也在大量的使用如 Castle Windsor.Structure

MEF 编程指南(十一):查询 CompositionContainer

CompositionContainer 公开了一部分获取导出.导出对象以及两者集合的重载. 在这些方法重载中,你应该遵循下面的共享行为准则 - 除非特别说明. 当请求单一实例的时候,如果没发现任何导入,将会抛出异常. 当请求单一实例的时候,如果发现不止一个导入,将会抛出异常. GetExportedValue 在下面的代码片段里,我们请求 Root(契约)实例的实例. var container = new CompositionContainer(new AssemblyCatalog(ty