- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在开发一个示例 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/
我正在开发一个示例 PRISM 应用程序,我想使用 MEF RegistrationBuilder 创建我的所有导出。使用 ExportAttribute 的等价物如下: [Export(typeof
我是一名优秀的程序员,十分优秀!