声明导出解释了部件导出服务的基础知识和价值观(Values).有时候出于种种原因,导出关联信息是非常必要的.通常,用于解释关于功能公共契约的具体实现.允许导入满足约束要求的导出,或者导入所有可用的实现并且在导出前在运行时检查他们的功能.   为导出附加元数据(Attaching Metadata to an Export)   考虑到 IMessageSender 服务更早引入.假设我们有一些实现,和相关的消费者实现(Consumer Of The Implementations)有差异.对于我…
可组合部件(Composable Parts)   在 MEF 内部可组合部件是一个可组合单元.可组合部件导出其他可组合部件需要的服务,并且从其他可组合部件导入服务.在 MEF 编程模型中,可组合部件用 [System.ComponentModel.Composition.Import] 和 [System.ComponentModel.Composition.Export] 特性标识,以便声明导出点和导入点.可组合部件应该包含至少一个导出点.可组合部件要么显式添加到容器或者通过使用目录创建.M…
理解 MEF 容器部件生命周期和实现是非常重要的事情.考虑到 MEF 关注可扩展应用程序.这变得尤为重要.生命期可以解释为期望部件的共享性(transitively, its exports)   共享,非共享与所有权(Share,Non Shared and ownership)   部件的共享性(Shareability)是通过使用 PartCreationPolicyAttribute 定义的.PartCreationPolicyAttribute 提供以下几种值:   Shared:部件…
在组合部件的时候,导入将会触发部件(部件集合)的实例化,为原始的请求部件公开必要的导出需求.对于有些应用程序,推迟实例化 - 并且防止递归组合图(Recursive Composition Down The Graph) - 因为创建长而复杂的对象图(Graph Of Object)的花费是昂贵和不必要的,这可能作为一个重要因素来考虑.   这是 MEF 支持延迟导出的动机.为了使用延迟导出,所有需要做的事情是使用导入 [System.Lazy<T>] 直接替换导入 [T] .如下例代码片段:…
组合部件通过 [System.ComponentModel.Composition.ExportAttribute] 特性声明导出.MEF 有几种不同的方式声明导出,包括在部件层面(Part Level),通过属性(Properties)和方法(Method)声明导出.     组合部件导出(Composable Part Exports)     当组合部件需要导出自身时候使用组合部件层面导出.为了组合部件导出自身,如下例代码所示,仅仅利用 [System.ComponentModel.Com…
目录(Catalogs)   MEF 特性编程模型的核心价值,拥有通过目录动态地发现部件的能力.目录允许应用程序轻松地使用那些通过 Export Attribute 注册自身的导出.下面列出 MEF 提供的目录.      程序集目录(Assembly Catalog)   为了发现给定程序集所有导出,需要使用 [System.ComponentModel.Composition.Hosting.AssemblyCatalog].   var catalog = new AssemblyCata…
MEF 容器实例并非不可变的.如果目录支持改变(像监控目录变动)或者在运行时添加/移除部件都可能发生改变.以前,你不得不做出改动并且调用 CompositionContainer 上的 Compose 方法.在 Preview 4 release上,我们已经介绍对批量组合的支持.   批处理包含一系列添加或移除的部件.在执行更改之后,容器自动地触发一次更新重组导入导致的变化的组合. 设想一个设置窗口的场景,用户选中或者取消选中一个选项.那些会映射当前的部件或者不在容器中的部件.请求批处理,你将会…
CompositionContainer 公开了一部分获取导出.导出对象以及两者集合的重载.   在这些方法重载中,你应该遵循下面的共享行为准则 - 除非特别说明.   当请求单一实例的时候,如果没发现任何导入,将会抛出异常. 当请求单一实例的时候,如果发现不止一个导入,将会抛出异常.   GetExportedValue   在下面的代码片段里,我们请求 Root(契约)实例的实例.   var container = new CompositionContainer(new Assembly…
当使用子容器的时候,基于特定的标准(Specific Criteria)过滤目录是很必要的.比如,基于部件构造策略的过滤器是很常见的.下面的代码片段演示了如何构建的特殊途径(Particular Approach):   var catalog = new AssemblyCatalog(typeof(Program).Assembly); var parent = new CompositionContainer(catalog); var filteredCat = new Filtered…
组合部件通过 [System.ComponentModel.Composition.ImportAttribute] 特性声明导入.类似于导出,也有几种不同的方法声明导入,即通过:字段(Fields).属性(Properties)和构造器参数(Constructor Parameters).     属性导入(Property Imports)     为了向属性导入值,使用 [System.ComponentModel.Composion.ImportAttribute] 特性标识.如下例中导…