我正在研究一个示例PRISM应用程序,我想使用MEF RegistrationBuilder来创建我的所有导出.相当于使用ExportAttribute如下:
[Export(typeof(IFooService))]
public class FooService : IFooService { ... }
Builder.ForTypesMatching(typeof(IFooService).IsAssignableFrom(type)).Export<IFooService>();
Run Code Online (Sandbox Code Playgroud)
但是,模块使用不同的属性,ModuleExportAttribute例如:
[ModuleExport(typeof(ModuleA), DependsOnModuleNames = new string[] { "ModuleB" })]
public sealed class ModuleA : IModule { ... }
Run Code Online (Sandbox Code Playgroud)
我不知道如何使用RegistrationBuilder该类创建模块导出而不是使用ModuleExportAttribute.这是否可行,因为它的出口方式与标准出口不同?
该ModuleExport属性本质上只是一个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)));
Run Code Online (Sandbox Code Playgroud)
您可以通过像这样导入模块来验证它的工作原理,这基本上就是 Prism 在幕后所做的事情:
[ImportMany]
Lazy<IModule, IModuleExport>[] Modules { get; set; }
Run Code Online (Sandbox Code Playgroud)
您应该注意,您必须在元数据中指定接口中的所有属性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));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
300 次 |
| 最近记录: |