一、演示概述
此演示介绍了MEF如何使用ImportMany特性同时导入多个与相同约束相匹配的导出部件,并且介绍了目录服务(Catalog),该服务告知MEF框架可以在什么地方去搜寻与指定约束匹配的导出部件,即导出部件位于什么地方。
相关下载(屏幕录像、代码)http://yunpan.cn/cVdN5JHeQrJgI 访问密码 065d
温馨提示:如果屏幕录像和代码不能正常下载,可站内留言,或发邮件到524130780@QQ.COM

欢迎有兴趣研究.NET相关技术的网友加QQ群:18507443

二、多部件导入ImportMany
部件的导出设置不做任何改变,将导入地方做类似如下的修改:

  1. [ImportMany(typeof(ILogger))]
  2. public IEnumerable<ILogger> Loggers { get; set; }

上述代码和单个部件的导入有两点区别:
1、使用ImportMany特性,而不是Import特性。
2、使用的是IEnumerable<T>类型来封装导入的部件。因为,导入的可能是多个部件,需要一种集合的方式来承载。

导入元素做了如上的修改后,调用时只需要遍历即可访问每个导出部件。如下代码所示:

  1. static void Main(string[] args)
  2. {
  3. Program program = new Program();
  4. program.Compose();
  5. foreach (ILogger logger in program.Loggers)
  6. {
  7. logger.WriteLog("Hello World!");
  8. }
  9. Console.ReadLine();
  10. }

三、目录服务(Catalog)
在MEF中,所谓的目录(Catalog)是不同于文件系统中的目录(Directory),而它的作用就是告知MEF框架可以在什么地方去查找导出部件,比如:
AssemblyCatalog:在指定的程序集中查找导出部件。
DirectoryCatalog:在指定的文件目录中查找导出部件,在构造函数中可传递文件目录,可以是绝对路径或相对路径。
代码如下:

  1. /// <summary>
  2. /// 通过容器对象将宿主和部件组装到一起。
  3. /// </summary>
  4. public void Compose()
  5. {
  6. AggregateCatalog aggregateCatalog = new AggregateCatalog();
  7. AssemblyCatalog assemblyCatalog = new AssemblyCatalog(typeof(Program).Assembly);
  8. DirectoryCatalog directoryCatalog = new DirectoryCatalog("imps");
  9. aggregateCatalog.Catalogs.Add(assemblyCatalog);
  10. aggregateCatalog.Catalogs.Add(directoryCatalog);
  11. var container = new CompositionContainer(aggregateCatalog);
  12. container.ComposeParts(this);
  13. }

上述代码中有一个AggregateCatalog的目录类,这是一个聚合目录,它可以将多个目录组织在一起,比如上列中的AssemblyCatalog和DirectoryCatalog。这样,MEF就会在多个地方去搜寻匹配的导出部件。

四、相关资源
1、MSDN官方资料:http://msdn.microsoft.com/zh-cn/library/dd460648(v=vs.110).aspx

[MEF]第04篇 MEF的多部件导入(ImportMany)和目录服务的更多相关文章

  1. [MEF]第01篇 MEF使用入门

    一.演示概述 此演示初步介绍了MEF的基本使用,包括对MEF中的Export.Import和Catalog做了初步的介绍,并通过一个具体的Demo来展示MEF是如何实现高内聚.低耦合和高扩展性的软件架 ...

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

    一.演示概述此演示介绍了MEF的延迟加载及元数据相关的内容.在实际的设计开发中,存在着某些对象是不需要在系统运行或者附属对象初始化的时候进行实例化的,只需要在使用到它的时候才会进行实例化,这种方式就可 ...

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

    一.演示概述本示例演示如何使用MEF提供的目录(Catalog)的扩展机制实现可过滤导出部件的自定义目录类.主要是通过继承ComposablePartCatalog基类,并实现接口INotifyCom ...

  4. [MEF]第02篇 MEF的导入导出契约

    一.演示概述此演示介绍了如何为Export指定导出的协议名和类型,以及如何为Import指定导入的协议名和类型,只有确保导出和导入的协议名和类型相匹配了,才能注入成功,否则注入就会失败.相关下载(屏幕 ...

  5. 第06篇 MEF部件的生命周期(PartCreationPolicy)

    一.演示概述 本演示介绍了MEF的生命周期管理,重点介绍了导出部件的三种创建策略,分别是:CreationPolicy.Any.CreationPolicy.Shared.CreationPolicy ...

  6. MEF 编程指南(九):部件生命周期

    理解 MEF 容器部件生命周期和实现是非常重要的事情.考虑到 MEF 关注可扩展应用程序.这变得尤为重要.生命期可以解释为期望部件的共享性(transitively, its exports)   共 ...

  7. MEF 编程指南(四):声明导入

    组合部件通过 [System.ComponentModel.Composition.ImportAttribute] 特性声明导入.类似于导出,也有几种不同的方法声明导入,即通过:字段(Fields) ...

  8. Django基础-04篇 Django开发前后端联动

    1. 写views views.py代码块 1.在前端以/article/{{ article.id }}这种方式请求后台, 参数配置在urls.py中path('category/<int:i ...

  9. 微服务探索之路04篇k8s增加子节点,metrics资源监控,ingress-nginx域名配置及https配置

    1 k8s增加子节点 1.1 子节点服务器安装docker,使用脚本自动安装 curl -fsSL https://get.docker.com | bash -s docker --mirror A ...

随机推荐

  1. Ubuntu下配置Nginx+PHP

    1.安装Nginxapt-get install nginx 2.启动Nginxservice nginx start 3.访问服务器IP 如果看到“Welcome to nginx!”说明安装好了. ...

  2. C++(三十三) — 全局函数、成员函数的区别

    区别: (1)全局函数的参数个数,比局部函数要多一个: (2)二者都可,返回元素.返回引用. class test { public: test(int a, int b) { this->a ...

  3. 重新学习MySQL数据库9:Innodb中的事务隔离级别和锁的关系

    重新学习MySQL数据库9:Innodb中的事务隔离级别和锁的关系 Innodb中的事务隔离级别和锁的关系 前言: 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁 ...

  4. python报错:TypeError: 'int' object is not subscriptable

    检查一遍报错的所在行,此报错一般是在整数上加了下标: 比如:   a = 4   c=a[2] 报错:line 2, in <module>    c=a[2] TypeError: 'i ...

  5. Shell 变量,Shell echo命令

    一.Shell 变量 定义变量时,变量名不加美元符号($,PHP语言中变量需要),如: your_name="runoob.com" 注意,变量名和等号之间不能有空格,这可能和你熟 ...

  6. ASP.NET MVC 路由系统类

    RouteData public class RouteData { private RouteValueDictionary _dataTokens; private IRouteHandler _ ...

  7. Apache编译安装

    1.准备好源码包并配置好yum源,需要的源码包包括:httpd-2.4.18.apr-1.5.2.tar.gz.apr-util-1.5.4.tar.gz 2.准备用户 groupadd -r apa ...

  8. 十五、dbms_space(分析段增长和空间的需求)

    1.概述 作用:用于分析段增长和空间的需求. 2.包的组成 1).unused_space作用:用于返回对象(表.索引.簇)的未用空间语法:dbms_space.unused_space(segmen ...

  9. hdu4685

    题解: 二分图匹配 对于每一个单身狗 见一个虚拟的人 然后就可以做了 代码: #include<cstdio> #include<cstring> #include<al ...

  10. python 获取当前时间(关于time()时间问题的重要补充)

    python 获取当前时间   我有的时候写程序要用到当前时间,我就想用python去取当前的时间,虽然不是很难,但是老是忘记,用一次丢一次,为了能够更好的记住,我今天特意写下python 当前时间这 ...