是否可以使用 MEF RegistrationBuilder 创建 PRISM ModuleExport?

Is it possible to use MEF RegistrationBuilder to create a PRISM ModuleExport?

我正在开发一个示例 PRISM 应用程序,我想使用 MEF RegistrationBuilder 创建我的所有导出。使用 ExportAttribute 的等价物如下:

[Export(typeof(IFooService))]
public class FooService : IFooService { ... }

Builder.ForTypesMatching(typeof(IFooService).IsAssignableFrom(type)).Export<IFooService>();

但是,模块使用不同的属性,ModuleExportAttribute,例如:

[ModuleExport(typeof(ModuleA), DependsOnModuleNames = new string[] { "ModuleB" })]
public sealed class ModuleA : IModule { ... }

我不确定如何使用 RegistrationBuilder class 来创建模块导出而不是使用 ModuleExportAttribute。这甚至可能吗,因为它的导出方式与标准导出方式不同?

The ModuleExport attribute 本质上只是一个带有类型安全元数据 (IModuleExport) 的 Export(typeof(IModule)) 属性。您可以通过自己添加此元数据轻松 "copy" 它的 RegistrationBuilder 行为。例如

RegistrationBuilder builder = new RegistrationBuilder();
builder.ForType<ModuleA>().Export<IModule>(eb => eb
   .AddMetadata("DependsOnModuleNames", new string[] { "ModuleB" })
   .AddMetadata("InitializationMode", InitializationMode.WhenAvailable)
   .AddMetadata("ModuleName", "ModuleA")
   .AddMetadata("ModuleType", typeof(ModuleA)));

您可以像这样导入您的模块来验证它是否有效,这基本上就是 Prism 在幕后所做的:

[ImportMany]
Lazy<IModule, IModuleExport>[] Modules { get; set; }

您应该注意,您必须在元数据 all 中指定 IModuleExport 接口中的属性,否则模块将不会被导入(因为它们不满足IModuleExport接口)


补充回答:

上面的代码是正确的工作方式;下面的代码看起来正确,但不起作用。

请务必注意,这仅在您使用 PartBuilder.Export(Action<ExportBuilder> exportConfiguration) 重载时有效。

RegistrationBuilder builder = new RegistrationBuilder();
builder.ForType<ModuleA>().Export<IModule>()
   .AddMetadata("DependsOnModuleNames", new string[] { "ModuleB" })
   .AddMetadata("InitializationMode", InitializationMode.WhenAvailable)
   .AddMetadata("ModuleName", "ModuleA")
   .AddMetadata("ModuleType", typeof(ModuleA));