MEF初体验之八:过滤目录
当在使用子容器的时候,基于某些具体标准来过滤目录可能是重要的。例如,基于部件的创建策略来过滤是很常见的。下面的代码片段演示了如何构建这种特别方法:
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初体验之八:过滤目录相关推荐
- MEF初体验之九:部件生命周期
理解MEF容器中部件的生命周期及其含义是非常重要的.鉴于MEF重点在开放端应用程序,这将变得尤其重要的,一旦app ships和第三方扩展开始运行,作为应用程序的开发者将很好地控制这一系列的部件.生命 ...
- MEF初体验之五:Lazy Exports
在一个部件组合中,导入将触发一个部件或者多个部件的实例化,这些部件暴露了所需原请求部件的必要的导入.对于一些应用程序来说,延迟实例化-防止图结构下的递归组合-可能对于将创建一个长久复杂的开销很大而不必 ...
- MEF初体验之六:导出和元素据
在导出声明这一节中解释了部件导出服务和值的基础知识.在某些情况下,出于多种原因,关联与导出相关的信息是有必要的.通常,它被用来解释一个指定的普通契约实现的能力.这对于允许导入约束满足它的导出,或者导入 ...
- Flink大数据实时计算系列-案例初体验:HotPages
Flink大数据实时计算系列-案例初体验:HotPages 目录 HotPages代码 输入日志 运行结果 HotPages代码 /*** Copyright (c) 2018-2028 尚硅谷 Al ...
- vue3.0 Composition API 上手初体验 使用 vue-router 构建多页面应用
vue3.0 Composition API 上手初体验 使用 vue-router 构建多页面应用 前两讲,我们已经顺利的使用 vue3.0 将项目跑起来了.但是实在是过于简陋,目前我们几乎不可能开 ...
- MEF 插件式开发 - DotNetCore 初体验
背景叙述 在传统的基于 .Net Framework 框架下进行的 MEF 开发,大多是使用 MEF 1,对应的命名空间是 System.ComponentModel.Composition.在 Do ...
- Net Core平台灵活简单的日志记录框架NLog+Mysql组合初体验
Net Core平台灵活简单的日志记录框架NLog初体验 前几天分享的"[Net Core集成Exceptionless分布式日志功能以及全局异常过滤][https://www.cnblog ...
- 从入门到入土:python爬虫|scrapy初体验|安装教程|爬取豆瓣电影短评相关信息(昵称,内容,时间和评分)
此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...
- JavaWeb进阶之路:MyBatis初体验
JavaWeb进阶之路:MyBatis初体验 1. 简介 1.1 什么是MyBatis MyBatis 是一款优秀的持久层框架. 它支持自定义 SQL.存储过程以及高级映射. MyBatis 免除了几 ...
最新文章
- window 10 桌面显示计算机的操作
- Deep Residual Learning for Image Recognition 笔记
- PythonOCC 3D图形库学习—创建立方体模型
- Mockito教程--思维导图笔记
- pytorch—torch.tensor.scatter操作解析
- HeadFirstJava——7_继承与多态
- 华三模拟器使用CRT远程进行设备配置
- HTML实现banner图切换
- 让插入PPT的音乐跨幻灯片后同时播放
- 如何编程软件(编程序入门)
- linux软件管理及软件仓库
- 深入理解Linux进程调度(0.4)
- windows xp 驱动开发(十八) USB驱动程序开发用到的工具总结
- 等保2.0.第九章.等保2.0基础知识
- iOS客户端开启FTP,其他设备访问手机本地文件操作实现
- Linux sort命令的细节问题 -k选项的真实用法
- 服务器显示测试模式,服务器未开启测试功能怎么办 | 手游网游页游攻略大全
- 王者荣耀服务器什么时候增加人数,王者荣耀正式服凌晨更新,新增几个细节改动...
- 计算机编码英语,字母编码
- Zeno节点系统中的C++最佳实践