2015-10-25 61 views
0

我想从我的MefBootStrapper实施WPF + PRISM + MEF初始化DownloadedPartCatalogCollection

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, 版本= 1.0.0.0,Culture = neutral,PublicKeyToken = null'模块。在模块目录 比赛上ModuleExportAttribute指定的模块类型确保模块的名称。”

挖下去棱镜,在MefModuleInitializer,有一个if (this.downloadedPartCatalogs.TryGet(moduleInfo, out partCatalog))和下载的部分是空的。我可以看到在MefModuleInitializer类,downloadedPartCatalogs通过ImportingConstructor属性注入。

这是我OrderDetailsModule类

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

的问题是,我在哪里可以导出downloadedPartCatalo GS?

回答

0

您的模块类必须实现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)); 
    . . . 
} 

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

+0

加入ModuleExport解决错误。但我的视图模型尚未初始化。据我所知,这将被推迟,直到视图实际上被放置在一个地区。可能有更好的方法来做到这一点,但现在我可以强制创建我的视图模型吗?我试过PartCreationPolicy [PartCreationPolicy(CreationPolicy.Shared)](期望在启动时创建一个单例实例)。我正在做的是做一个[ViewExport(RegionName = RegionNames.OrderDetails)]到一个小区域使棱镜加载我的视图模型。 – asb