gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:43:54 24 4
gpt4 key购买 nike

我正在开发一个示例 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 创建模块导出。这甚至可能吗,因为它的导出方式与标准导出方式不同?

最佳答案

The ModuleExport attribute本质上只是一个 Export(typeof(IModule))具有类型安全元数据的属性 ( IModuleExport )。您可以使用 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; }

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


添加到答案中:

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

重要的是要注意,这只有在您使用 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));

关于c# - 是否可以使用 MEF RegistrationBuilder 创建 PRISM ModuleExport?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39257505/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com