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

本文共 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

你可能感兴趣的文章
github 在ubuntu 使用--常用命令
查看>>
hl7 V2中Message Control ID的含义及应用
查看>>
IOS 4个容易混淆的属性(textAligment contentVerticalAlignment contentHorizontalAlignment contentMode)...
查看>>
iOS 修改textholder的颜色
查看>>
【资料】wod地城掉落
查看>>
C# FTPHelper(搬运)
查看>>
C#HttpHelper类1.3正式版教程与升级报告
查看>>
【转】Android 语言切换过程分析
查看>>
jpa 多对多关系的实现注解形式
查看>>
Android开发——View绘制过程源码解析(一)
查看>>
Quartz和TopShelf Windows服务作业调度
查看>>
让ie9之前的版本支持canvas
查看>>
排序规则
查看>>
percent的用法
查看>>
中文词频统计
查看>>
Hibernate三种状态详解
查看>>
判断一个数是否是2^N次方
查看>>
Java Win自动环境配置脚本
查看>>
springMVC+Java验证码完善注册功能
查看>>
在虚拟机中的Linux系统搭建ftp服务器,使用nginx代理,实现外网访问ftp服务器的文件——centos6.5系统中的nginx安装及配置...
查看>>