摘要: 此章节来自msdn。一、一般调试方法在 Managed Extensibility Framework (MEF) 中调试问题可能非常困难,因为潜在问题与标准应用程序中的潜在问题不同。 本主题提供了特定于 MEF 的问题诊断技巧,并且提供了这些问题的一些可能原因。发现 MEF 问题解决 MEF 问题的第一步是在应用程序的 MEF 部分中定位问题。 下表列出了特定于 MEF 的问题。问题可能的原因组合期间引发 ImportCardinalityMismatchException 异常。由于部件缺失或被拒绝,无法使用匹配的导出填充导入。- 或 -预期单个导出的导入发现多个匹配项。具有 Import 阅读全文
posted @ 2013-06-10 10:11 一个人在北京 阅读(2526) 评论(0) 推荐(1) 编辑
摘要: 重新组合是 MEF 的一项功能,此功能允许部件在系统中出现新的匹配导出时自动更新其导入。重新组合在某些方案中十分有用,AllowRecomposition=true参数就表示运行在有新的部件被装配成功后进行部件集的重组。例如从远程服务器下载部件时。SalesOrderManager 可以进行更改,以便在其启动时,可启动多个可选视图的下载。这些视图显示时,会出现在视图工厂中。为了使 ViewFactory 可重新组合,我们在 Views 属性的 ImportMany 特性上将 AllowRecomposition 属性设置为 true,如下所示:代码段[Export]public class V 阅读全文
posted @ 2013-06-10 09:57 一个人在北京 阅读(1280) 评论(0) 推荐(0) 编辑
摘要: 由于部件承载于组合容器中,因此其生命周期可能比普通对象更复杂。 部件可实现两个重要的生命周期相关接口:IDisposable 和 IPartImportsSatisfiedNotification。需要在关闭时执行工作的部件和需要释放资源的部件应照常为 .NET Framework 对象实现 IDisposable。 但是,由于容器创建并维护对部件的引用,因此只有拥有部件的容器才应对其调用 Dispose 方法。 容器本身实现 IDisposable,并且作为 Dispose 中其清理的一部分,它将对拥有的所有部件调用 Dispose。 因此,当不再需要组合容器及其拥有的任何部件时,您应始终释 阅读全文
posted @ 2013-06-09 17:06 一个人在北京 阅读(1435) 评论(0) 推荐(1) 编辑
摘要: 在某些情况下,您可能需要防止部件作为目录的一部分被发现。 例如,部件可能是应从中继承(而不是使用)的基类。 可通过两种方式来实现此目的。 首先,可以对部件类使用 abstract 关键字。 尽管抽象类能够向派生自抽象类的类提供继承的导出,但抽象类从不提供导出。如果无法使类成为抽象类,您可以使用 PartNotDiscoverable 特性来修饰它。 用此特性修饰的部件将不会包括在任何目录中。 下面的示例演示这些模式。 DataOne 将被目录发现。 由于 DataTwo 是抽象的,因此它将不会被发现。 由于 DataThree 使用了 PartNotDiscoverable 特性,因此它将不会 阅读全文
posted @ 2013-06-09 17:02 一个人在北京 阅读(851) 评论(0) 推荐(0) 编辑
摘要: 当部件指定执行导入和组合时,组合容器将尝试查找匹配的导出。 如果它将导入与导出成功匹配,则导入成员将设置为导出的对象的实例。 导出部件的创建策略控制此实例来源于何处。两个可能的创建策略为:“共享”和“非共享”。 在具有该协定的部件的容器中,创建策略为“共享”的部件将在每个导入之间共享。 当组合引擎找到匹配项并且必须设置导入属性时,它只有在部件尚不存在时才会实例化部件的新副本;否则它将提供现有副本。 这意味着许多对象可能会引用相同部件。 此类部件不应依赖于可能会从许多地方更改的内部状态。 此策略适用于静态部件、提供服务的部件,以及消耗大量内存或其他资源的部件。在每次找到部件的其中一个导出的匹配导 阅读全文
posted @ 2013-06-09 16:59 一个人在北京 阅读(2112) 评论(0) 推荐(0) 编辑
摘要: 为了允许访问元数据,MEF 使用 .NET Framework 4 的一个新 API,即 System.Lazy<T>。使用该 API 可延迟实例的实例化,直至访问 Lazy 的 Value 属性。MEF 使用 Lazy<T,TMetadata> 进一步扩展 Lazy<T>,以允许在不实例化基础导出的情况下访问导出元数据。元数据可用于将导出的对象的属性传递到导入部件。 导入部件可以使用此数据来决定要使用哪些导出,或收集有关导出的信息而不必构造导出。 因此,导入必须为延迟导入才能使用元数据。为了使用元数据,您通常会声明一个称为“元数据视图”的接口,该接口声明什 阅读全文
posted @ 2013-06-08 21:38 一个人在北京 阅读(1898) 评论(1) 推荐(1) 编辑
摘要: 导入导出的方式: 一、类当一个部件需要导出自身时一个组成部件级别的导出经常用。为了让部件导出自己,简单的方法是用[System.ComponentModel.Composition.ExportAttribute]特性修饰一个组成部件,正如下面所示一样:代码段[Export]public class ConsoleLogger{ public void Write(string message) { Console.WriteLine(message); }}主程序(导入部分)代码如下:代码段class Program { ... 阅读全文
posted @ 2013-06-01 22:41 一个人在北京 阅读(2603) 评论(0) 推荐(0) 编辑
摘要: MEF中使用导出与导入,实质上就是对一个对象的实例化的过程,通过MEF的特性降低了对象的直接依赖,从而让系统的设计达到一种高灵活、高扩展性的效果。(本篇内容来自msdn)导入的类型MEF 支持若干导入类型,其中包括动态导入、延迟导入、必备导入和可选导入。动态导入在某些情况下,导入类可能需要与具有特定协定名称的任何类型的导出匹配。 在这种情况下,类可以声明动态导入。 下面的导入与具有协定名称“TheString”的任何导出匹配。代码段public class MyClass{ [Import("TheString")] public dynamic MyAddin { get 阅读全文
posted @ 2013-06-01 22:14 一个人在北京 阅读(1820) 评论(0) 推荐(0) 编辑
摘要: 1、框架中的Catalog在MEF框架中,包含了4种Catalog,所有的Catalog的是从System.ComponentModel.Composition.Primitives名称空间下的ComposablePartCatalog抽象类派生下来。AssemblyCatalog:表示从程序集中搜索部件的目录。DirectoryCatalog:表示从文件系统的指定路径中,搜索程序集,从而搜索部件。TypeCatalog:表示从指定的类型集合中,去搜索相应的部件。AggregateCatalog:聚合目录,可以添加上面所说的所有目录,从而进行多方面的部件搜索。直接添加部件到容器:在Compos 阅读全文
posted @ 2013-06-01 22:03 一个人在北京 阅读(3951) 评论(3) 推荐(0) 编辑
摘要: 注意:默认一个类型会被用作契约,而不是一个字符串。虽然契约可以作为一个任意的字符串,但这会导致多义性。例如:“Sender"可能会被另一个项目不同类库里面的"Sender"所覆盖。所以如果你需要指定一个字符串契约,建议你契约的命名应该用命名空间来规范,包括公司名称,例如:"Contoso.Exports.Sender".按照上面的代码说明,所有的导出应该是这样的:代码段namespace MEFSample{ [Export] public class Exporter {...} [Export(typeof(Exporter))] publ 阅读全文
posted @ 2013-05-31 20:59 一个人在北京 阅读(1910) 评论(0) 推荐(0) 编辑