WPF + PRISM + MEF初始化DownloadedPartCatalogCollection

时间:2015-10-25 00:51:22

标签: c# .net wpf prism mef

我正在尝试从我的MefBootStrapper实现初始化模块

Type type = typeof(OrderDetailsModule.OrderDetailsModule);

ModuleInfo mi = new ModuleInfo {
    ModuleName = type.Name,
    Ref = new Uri(type.Assembly.Location, UriKind.RelativeOrAbsolute).AbsoluteUri,
        InitializationMode =InitializationMode.WhenAvailable,
        ModuleType = type.AssemblyQualifiedName
    };

this.ModuleCatalog.AddModule(mi);

我收到错误

  

无法加载模块OrderDetailsModule的类型。 \ r \ n错误是:   无法找到具有类型的模块   ' OrderDetailsModule.OrderDetailsModule,OrderDetailsModule,   Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'之间   导出的模块。确保模块目录中的模块名称   在ModuleExportAttribute上为模块类型指定的匹配项。"

在MefModuleInitializer中挖掘Prism,有if (this.downloadedPartCatalogs.TryGet(moduleInfo, out partCatalog)),下载的部分为空。我可以在MefModuleInitializer类中看到,insertedCartCatalogs是通过ImportingConstructor属性注入的。

这是我的OrderDetailsModule类

[Export("OrderDetailsModule")]
public class OrderDetailsModule
{
}

问题是,我在哪里导出已下载的PartCatalogs?

1 个答案:

答案 0 :(得分:1)

您的模块类必须实现IModule接口并归属于ModuleExportAttribute。

[ModuleExport(typeof(ModuleD))]
public class ModuleD : IModule 
{...}

或使用AssemblyCatalog自动发现和加载模块。

protected override void ConfigureAggregateCatalog()
{
    base.ConfigureAggregateCatalog();

    this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(ModuleA).Assembly));
    this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(ModuleC).Assembly));
    . . .
}

请阅读Prism文档:https://github.com/PrismLibrary/Prism/blob/master/Documentation/WPF/30-ModularApplicationDevelopment.md#modules-in-mef