c# - 如何在MEF中编写某个部分?

标签 c# mef

我有一个 MEF 扩展和一个组成它一部分的类库。 目前我认为它的工作原理如下

_container.ComposeParts(obj);

上面将组成 obj 类的成员中的所有属性部分。我想做类似以下的事情(注意:以下代码仅用于演示目的,与 MSDN 中记录的 CompositionContainer 对象模型无关)

IMyCustomPart partObj = _container.ComposeACertainPart<IMyCustomPart>();

MEF 允许这样做吗?

最佳答案

您可以使用 CompositionContainerGetExportXXXXX 方法:

获取单个零件:

var part = _container.GetExportedValue<IMyCustomPart>();

请注意,仅当只有一个导出部件时,此方法才有效。

导出零件序列(零个或多个):

var parts = _container.GetExportedValues<IMyCustomPart>();

如果您想避免抛出ImportCardinalityMismatchException,这是首选.

MEF 还支持延迟导出 (Lazy<>)。如果您希望以懒惰的方式创建零件,这些会非常方便。

但请注意,默认情况下 MEF 正在导出共享部件。这意味着在组合或调用 GetExportXXXX 期间仅创建并传递一个实例。要克服这个问题,您可以设置非共享 PartCreationPolicy :

[Export]
[PartCreationPolicy(CreationPolicy = CreationPolicy.NonShared)]
public class MyExportedClass { ... }

最后是ExportFactory如果您想创建非共享部分并自己处理它们的生命周期(在大多数其他情况下由容器完成),这会有所帮助。有关 ExportFactory 的介绍,请查看 ExportFactory in MEF 2 .

关于c# - 如何在MEF中编写某个部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21766063/

相关文章:

c# - 跨平台解决方案中哪些项目需要引用 .Net 标准库

c# - 如何为ListView制作滚动事件

c# - 使用 MEF 与事件交互

c# - 带有 MEF 的 ASP.NET MVC4 : Requests to MEF Controllers Processed Serially

c# - Entity Framework : dynamically change model based on plugins found with MEF

c# - MEF 从预先存在的属性中导出

c# - FromBody 未绑定(bind)字符串参数

c# - 使用 IDataErrorInfo 的 WPF MVVM 验证

c# - 从 Windows 文件时间转换为 DateTime

visual-studio-2010 - Visual Studio 2010 扩展管理器崩溃