是否可以使用 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));
我正在开发一个示例 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));