我正在开发一个示例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
。这是否可行,因为它的出口方式与标准出口不同?
答案 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