MEF初体验之七:Using Catalogs】的更多相关文章

MEF特性化编程模型的价值主张之一是通过catalogs动态发现部件的能力.Catalogs允许应用程序很容易地消费那些通过[Export]已经自我注册的exports. Assembly Catalog 为了在一个特定的程序集中发现所有的exports,可以使用System.ComponentModel.Composition.Hosting.AssemblyCatalog类. var catalog = new AssemblyCatalog(System.Reflection.Assemb…
组合部件 在MEF中,一个组合部件就是一个组合单元,组合部件"出口"其它组合部件需要的服务并且从其它部件"进口"需要的服务.在MEF编程模型中,为了声明组合部件的"出口"和"进口",使用的是ExportAttribute和ImportAttribute.一个组合部件至少应该包含一个[Export].组合部件既可以被显式的添加到Container,也可以通过使用Catalogs来创建.MEF附带的默认的Catalogs是通过[E…
一些应用程序被设计成在运行时可以动态改变.例如,一个新的扩展被下载,或者因为其它的多种多样的原因其它的扩展变得不可用.MEF处理这些多样的场景是依赖我们称作重组的功能来实现的,它可已在最初的组合后改变导入的值. 导入可以通知MEF它通过[Import]使用Allowrecomposition属性来支持重组.看下面的代码片段: [Export] public class HttpServerHealthMonitor { [ImportMany(AllowRecomposition=true)]…
在MEF出现以前,其实微软已经发布了一个类似的框架,叫MAF(Managed Add-in Framework),它旨在使应用程序孤立和更好的管理扩展,而MEF更关心的是可发现性.扩展性和轻便性,后者更lightweight.我们将跟随MEF官网来学习. The Managed Extensibility Framework or MEF is a library for creating lightweight, extensible applications. It allows appli…
一个MEF容器实例是不可变的.如果catalog支持改变(像观察一个目录的改变)或是如果你的代码在运行时添加或移除部件,改变都可能发生.以前,你不得不作出改变并在组合容器上调用它的组合方法.在Preview 4 版中,我们已经介绍了对Composition Batch的支持. 批处理包含了一系列要添加或移除的部件.变化执行后,容器将自动地触发重合,这将更新受变化影响的可重组导入.考虑这样一个场景,一个设置窗口和一个用户选择和取消选择项.这些将导致映射到当前容器中部件与否.为了应用batch,你将…
理解MEF容器中部件的生命周期及其含义是非常重要的.鉴于MEF重点在开放端应用程序,这将变得尤其重要的,一旦app ships和第三方扩展开始运行,作为应用程序的开发者将很好地控制这一系列的部件.生命周期可以被解释为这样一个部件期望的共享物,无论是一个新的部件被创建还是一个部件被关闭或释放都由控制策略来翻译. Shared, Non Shared and ownership 通过使用PartCreationPolicyAttribute特性设置CreationPolicy(类级别)来定义一个部件…
当在使用子容器的时候,基于某些具体标准来过滤目录可能是重要的.例如,基于部件的创建策略来过滤是很常见的.下面的代码片段演示了如何构建这种特别方法: var catalog = new AssemblyCatalog(typeof(Program).Assembly); var parent = new CompositionContainer(catalog); var filteredCat = new FilteredCatalog(catalog, def => def.Metadata.…
在一个部件组合中,导入将触发一个部件或者多个部件的实例化,这些部件暴露了所需原请求部件的必要的导入.对于一些应用程序来说,延迟实例化-防止图结构下的递归组合-可能对于将创建一个长久复杂的开销很大而不必要的对象的图来说是一个重要的因素. 正是出于这样的动机,MEF支持叫做lazy exports的导出.为了使用它,你需要做的是直接导入一个[System.Lazy<T>]而不是的[T].例如,考虑下面的代码片段: public class HttpServerHealthMonitor { [Im…
组合部件使用[System.ComponentModel.Composition.ImportAttribute]特性声明导入.与导出类似,也有几种成员支持,即为字段.属性和构造器参数.同样,我们也来看下该特性类的声明: [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple=false, Inherited=false)] pub…
组合部件通过[ExportAttribute]声明exports.在MEF中,有这么几种成员可声明exports的方式:组合部件(类).字段.属性和方法.我们来看下ExportAttribute类的声明: [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Method | AttributeTargets.Class, AllowMultiple=true, Inherite…