当在使用子容器的时候,基于某些具体标准来过滤目录可能是重要的。例如,基于部件的创建策略来过滤是很常见的。下面的代码片段演示了如何构建这种特别方法:

var catalog = new AssemblyCatalog(typeof(Program).Assembly);
var parent = new CompositionContainer(catalog);var filteredCat = new FilteredCatalog(catalog,def => def.Metadata.ContainsKey(CompositionConstants.PartCreationPolicyMetadataName) &&((CreationPolicy)def.Metadata[CompositionConstants.PartCreationPolicyMetadataName]) == CreationPolicy.NonShared);
var child = new CompositionContainer(filteredCat, parent);var root = child.GetExportedObject<Root>();
child.Dispose();

如果CreationPolicy还足以作为一个标准来选择部件的话,你或许想使用[PartMetadata]来代替。它允许你附加元数据在部件上,因此你可以使用它来构建一个过滤表达式。例如,下面是一个应用该特性的类:

[PartMetadata("scope", "webrequest"), Export]
public class HomeController : Controller
{
} 

这使你可以用那些应该被限定到一个(逻辑)web请求的部件来创建子容器。注意它由你来定义一个范围边界,换句话说,MEF并不知道"webrequest"是什么,因此,你必须在每次web请求时建立一些基础设施代码来创建/释放容器。

var catalog = new AssemblyCatalog(typeof(Program).Assembly);
var parent = new CompositionContainer(catalog);var filteredCat = new FilteredCatalog(catalog,def => def.Metadata.ContainsKey("scope") &&def.Metadata["scope"].ToString() == "webrequest");
var perRequest = new CompositionContainer(filteredCat, parent);var controller = perRequest.GetExportedObject<HomeController>();
perRequest.Dispose();

注意:我们没有提供FilteredCatalog类。下面我们将拿一个简单的实现来说明创建FilteredCatalog:

using System;
using System.ComponentModel.Composition.Primitives;
using System.ComponentModel.Composition.Hosting;
using System.Linq;
using System.Linq.Expressions;public class FilteredCatalog : ComposablePartCatalog, INotifyComposablePartCatalogChanged
{private readonly ComposablePartCatalog _inner;private readonly INotifyComposablePartCatalogChanged _innerNotifyChange;private readonly IQueryable<ComposablePartDefinition> _partsQuery;public FilteredCatalog(ComposablePartCatalog inner,Expression<Func<ComposablePartDefinition, bool>> expression){_inner = inner;_innerNotifyChange = inner as INotifyComposablePartCatalogChanged;_partsQuery = inner.Parts.Where(expression);}public override IQueryable<ComposablePartDefinition> Parts{get{return _partsQuery;}}public event EventHandler<ComposablePartCatalogChangeEventArgs> Changed{add{if (_innerNotifyChange != null)_innerNotifyChange.Changed += value;}remove{if (_innerNotifyChange != null)_innerNotifyChange.Changed -= value;}}public event EventHandler<ComposablePartCatalogChangeEventArgs> Changing{add{if (_innerNotifyChange != null)_innerNotifyChange.Changing += value;}remove{if (_innerNotifyChange != null)_innerNotifyChange.Changing -= value;}}
}

最后举个简单例子:

using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;namespace FilteringCatalogsSample
{class Program{[ImportMany]public IEnumerable<IMessageSender> Senders { get; set; }static void Main(string[] args){Program p = new Program();p.Compose();foreach (var item in p.Senders){item.Send("Hi,MEF");}Console.ReadKey();}void Compose(){var catalog = new AssemblyCatalog(typeof(Program).Assembly);var parent = new CompositionContainer(catalog);var filterCatalog = new FilteredCatalog(catalog,def => def.Metadata.ContainsKey("methods")&& def.Metadata["methods"].ToString() == "sms");//var AggrContainer = new CompositionContainer(filterCatalog, parent);var child = new CompositionContainer(filterCatalog);child.ComposeParts(this);}}interface IMessageSender{void Send(string msg);}[Export(typeof(IMessageSender))]public class EmailSender : IMessageSender{public void Send(string msg){Console.WriteLine("Email sent:" + msg);}}[Export(typeof(IMessageSender))]public class SecureEmailSender : IMessageSender{public void Send(string msg){Console.WriteLine("Secure Email sent:" + msg);}}[Export(typeof(IMessageSender))][PartMetadata("methods","sms")]public class SMSSender : IMessageSender{public void Send(string msg){Console.WriteLine("SMS sent:" + msg);}}
}

输出如图:

转载于:https://www.cnblogs.com/jellochen/p/3665055.html

MEF初体验之八:过滤目录相关推荐

  1. MEF初体验之九:部件生命周期

    理解MEF容器中部件的生命周期及其含义是非常重要的.鉴于MEF重点在开放端应用程序,这将变得尤其重要的,一旦app ships和第三方扩展开始运行,作为应用程序的开发者将很好地控制这一系列的部件.生命 ...

  2. MEF初体验之五:Lazy Exports

    在一个部件组合中,导入将触发一个部件或者多个部件的实例化,这些部件暴露了所需原请求部件的必要的导入.对于一些应用程序来说,延迟实例化-防止图结构下的递归组合-可能对于将创建一个长久复杂的开销很大而不必 ...

  3. MEF初体验之六:导出和元素据

    在导出声明这一节中解释了部件导出服务和值的基础知识.在某些情况下,出于多种原因,关联与导出相关的信息是有必要的.通常,它被用来解释一个指定的普通契约实现的能力.这对于允许导入约束满足它的导出,或者导入 ...

  4. Flink大数据实时计算系列-案例初体验:HotPages

    Flink大数据实时计算系列-案例初体验:HotPages 目录 HotPages代码 输入日志 运行结果 HotPages代码 /*** Copyright (c) 2018-2028 尚硅谷 Al ...

  5. vue3.0 Composition API 上手初体验 使用 vue-router 构建多页面应用

    vue3.0 Composition API 上手初体验 使用 vue-router 构建多页面应用 前两讲,我们已经顺利的使用 vue3.0 将项目跑起来了.但是实在是过于简陋,目前我们几乎不可能开 ...

  6. MEF 插件式开发 - DotNetCore 初体验

    背景叙述 在传统的基于 .Net Framework 框架下进行的 MEF 开发,大多是使用 MEF 1,对应的命名空间是 System.ComponentModel.Composition.在 Do ...

  7. Net Core平台灵活简单的日志记录框架NLog+Mysql组合初体验

    Net Core平台灵活简单的日志记录框架NLog初体验 前几天分享的"[Net Core集成Exceptionless分布式日志功能以及全局异常过滤][https://www.cnblog ...

  8. 从入门到入土:python爬虫|scrapy初体验|安装教程|爬取豆瓣电影短评相关信息(昵称,内容,时间和评分)

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  9. JavaWeb进阶之路:MyBatis初体验

    JavaWeb进阶之路:MyBatis初体验 1. 简介 1.1 什么是MyBatis MyBatis 是一款优秀的持久层框架. 它支持自定义 SQL.存储过程以及高级映射. MyBatis 免除了几 ...

最新文章

  1. window 10 桌面显示计算机的操作
  2. Deep Residual Learning for Image Recognition 笔记
  3. PythonOCC 3D图形库学习—创建立方体模型
  4. Mockito教程--思维导图笔记
  5. pytorch—torch.tensor.scatter操作解析
  6. HeadFirstJava——7_继承与多态
  7. 华三模拟器使用CRT远程进行设备配置
  8. HTML实现banner图切换
  9. 让插入PPT的音乐跨幻灯片后同时播放
  10. 如何编程软件(编程序入门)
  11. linux软件管理及软件仓库
  12. 深入理解Linux进程调度(0.4)
  13. windows xp 驱动开发(十八) USB驱动程序开发用到的工具总结
  14. 等保2.0.第九章.等保2.0基础知识
  15. iOS客户端开启FTP,其他设备访问手机本地文件操作实现
  16. Linux sort命令的细节问题 -k选项的真实用法
  17. 服务器显示测试模式,服务器未开启测试功能怎么办 | 手游网游页游攻略大全
  18. 王者荣耀服务器什么时候增加人数,王者荣耀正式服凌晨更新,新增几个细节改动...
  19. 计算机编码英语,字母编码
  20. Zeno节点系统中的C++最佳实践

热门文章

  1. 网页静态服务器-2显示需要的页面
  2. SSH详解以及免密登录配置,深入理解
  3. 深度学习《再探AE和VAE的区别》
  4. hibernate中createQuery和createSqlQuery
  5. 作为面向事务的客户服务器协议,湖南大学《计算机网络》实验报告.doc
  6. 循环序列模型 —— 1.9 GRU单元(门控循环单元)
  7. 龙格-库塔(Runge-Kutta)法解微分方程
  8. 事件 ID 3001错误的解决方法
  9. Scintilla 3 24在MFC中的使用 动态 静态
  10. Hibernate通用Dao实现