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

时间:2016-08-31 19:23:48

标签: c# prism mef

我正在开发一个示例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类创建模块导出而不是使用ModuleExportAttribute。这是否可行,因为它的出口方式与标准出口不同?

1 个答案:

答案 0 :(得分:1)

The ModuleExport attribute基本上只是一个带有类型安全元数据(Export(typeof(IModule)))的IModuleExport atttibute。你可以轻松地复制&#34;通过自己添加此元数据与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界面中的属性,否则将无法导入模块(因为它们不满足{ {1}}界面)

添加答案

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

重要的是要注意,这仅在您使用PartBuilder.Export(Action<ExportBuilder> exportConfiguration)重载时才有效。

IModuleExport