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

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. 找到一篇有关A*算法文章,不错~收藏
  2. 不能错过的RTS经典:《蘑菇战争2》是如何做玩法创新的?
  3. mongodb指南(翻译)(一) - 翻译前言
  4. 分享一个帮助你在线测试响应式设计的web工具 - Screenqueri.es
  5. 使用Swagger,ApiExplorer和NSwag掌握ASP.NET Core和ABP中的外部Web API
  6. 二、kafka基本操作和管理
  7. 使用 bash 脚本把 GCE 的数据备份到 GCS
  8. Windows下编译sqlite3
  9. Flutter - 底部导航详解与案例示范
  10. CCSpriteBatchNode(附:CCMenu与CCSpriteBatchNode的问题)
  11. c++ List、Vector、Stack、Queue使用
  12. 2021-11-16
  13. 不同尺寸SMA头介绍以及之间的区别
  14. linux 使用icc运行tcl,Tcl在ICC2中的应用:定义一个proc,实现将一个cell直接替换成另一个功能不等价的cell...
  15. IT行业职位分为六大类
  16. dede服务器建站_新手搭建DeDecms织梦网站的详细操作流程
  17. 一台电脑两个macOS系统,怎么装
  18. linux speedtest-cli工具测试网络带宽、测试网速(下载速度、上传速度和延迟等信息)
  19. 网络技巧|远程桌面连接不上的多种解决方案!
  20. javascript tree

热门文章

  1. Hive 时间戳和日期相互转换
  2. 利用Flash读取SQL Server数据库的值
  3. 【opencv学习】【Canny边缘检测】
  4. ELMo代码详解(二)
  5. [深度学习-实践]GAN入门例子-利用Tensorflow Keras与数据集CIFAR10生成新图片
  6. 计算机启动硬盘响,电脑开机时硬盘响个不停是什么原因?原因分析与解决方法介绍...
  7. leetcode —— 面试题68 - II. 二叉树的最近公共祖先
  8. 自然语言处理 —— 2.5 学习词嵌入
  9. 去哪儿-13-city-vuex
  10. 【高斯和拉普拉斯为什么分别对应L2和L1?】差分隐私系统学习记录(五)