博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MEF 编程指南(八):过滤目录
阅读量:5995 次
发布时间:2019-06-20

本文共 2917 字,大约阅读时间需要 9 分钟。

当使用子容器的时候,基于特定的标准(Specific Criteria)过滤目录是很必要的。比如,基于部件构造策略的过滤器是很常见的。下面的代码片段演示了如何构建的特殊途径(Particular Approach):

 
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
(); child.Dispose();
 
如果 CreationPolicy 作为标准选择部件不能满足需求,你可能想到使用 [System.ComponentModel.Composition.PartMetadataAttribute] 替代。它允许为部件附加元数据,因此可以使用它构建过滤表达式。下面的示例就是 PartMetadata 特性的应用:
 
[PartMetadata("scope", "webrequest"), Export] public class HomeController : Controller { }  
 
这允许你创建局限于 Web 请求(逻辑)部件的子容器。请注意:范围边界取决于你的定义,换句话说,MEF 不知道 "webrequest"是什么,所以你不得不创建一些基础代码来在每次Web 请求时创建/回收(Create/Dispose)容器。
 
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
(); perRequest.Dispose();

 

注意:我们并没有提供 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
_partsQuery; public FilteredCatalog(ComposablePartCatalog inner, Expression
> expression) { _inner = inner; _innerNotifyChange = inner as INotifyComposablePartCatalogChanged; _partsQuery = inner.Parts.Where(expression); } public override IQueryable
Parts { get { return _partsQuery; } } public event EventHandler
Changed { add { if (_innerNotifyChange != null) _innerNotifyChange.Changed += value; } remove { if (_innerNotifyChange != null) _innerNotifyChange.Changed -= value; } } public event EventHandler
Changing { add { if (_innerNotifyChange != null) _innerNotifyChange.Changing += value; } remove { if (_innerNotifyChange != null) _innerNotifyChange.Changing -= value; } }}
 
原文地址:

转载于:https://www.cnblogs.com/JavCof/p/3684281.html

你可能感兴趣的文章
2017-2018:时间戳
查看>>
php实现 明明的随机数
查看>>
Guava中针对集合的 filter和过滤功能
查看>>
小程序顶部导航栏的自定义
查看>>
ZooKeeper系列(3):znode说明和znode状态
查看>>
Java Arrays.sort源代码解析
查看>>
使用buildroot创建自己的交叉编译工具链【转】
查看>>
使用superlance插件增强supervisor的监控能力
查看>>
Dcloud课程7 单例模式一般用在什么场景
查看>>
Js:消息弹出框、获取时间区间、时间格式、easyui datebox 自定义校验、表单数据转化json、控制两个日期不能只填一个...
查看>>
移动Web前端,游客点击商品的收藏按钮,登录完成,回来之后,如何自动收藏...
查看>>
css自适应浏览器大小
查看>>
C#与C++的发展历程第二 - C#4.0再接再厉
查看>>
VS Code使用 Vue工程配置 eslint
查看>>
107. 二叉树的层次遍历 II
查看>>
ionic3+angular4+cordova 项目实例
查看>>
tracepath 路由跟踪命令
查看>>
(转)设计模式——观察者模式
查看>>
Jar包冲突解决方法
查看>>
彻底搞清楚Java并发 (一) 基础
查看>>