Prism 7.0升级至8.1时Default Region Adapters未自动注册问题问询
问题原因
- Prism 7.x版本内置MEF支持时,
MefBootstrapper基类会在初始化阶段自动调用RegionAdapterMappings的注册逻辑,扫描所有默认IRegionAdapter实现并注入到容器中 - Prism 8.1已完全移除MEF内置支持,官方仅对DryIoc、Unity两个维护中的DI容器做默认适配,你自行实现的MEF容器扩展没有集成Prism.Core中定义的区域适配器自动注册钩子,所以会出现默认适配器未注册的问题,不属于Prism本身的功能缺陷。
修复方案
- 主动触发默认区域适配器注册:在你自定义的MEF Bootstrapper的
ConfigureContainer阶段,注册WPF默认区域适配器(如果是其他平台替换对应命名空间的实现即可),参考代码:
// 需先确保RegionBehaviorFactory已正常初始化 containerRegistry.RegisterInstance<IRegionAdapter>(new ContentControlRegionAdapter(RegionBehaviorFactory)); containerRegistry.RegisterInstance<IRegionAdapter>(new SelectorRegionAdapter(RegionBehaviorFactory)); containerRegistry.RegisterInstance<IRegionAdapter>(new ItemsControlRegionAdapter(RegionBehaviorFactory));
- 检查你实现的MEF容器扩展的
IContainerRegistry接口实现,确认RegisterMany方法逻辑完整,Prism内部的批量服务注册逻辑依赖该方法实现接口和实现类的映射,如果该方法为空,除了区域适配器外,后续区域行为、事件聚合器等服务也可能出现注册失败的问题。 - 调整
CreateRegionAdapterMappings方法逻辑,不要直接实例化空的映射对象,改为从容器中解析已经完成注册的实例:
protected override RegionAdapterMappings CreateRegionAdapterMappings() { return Container.Resolve<RegionAdapterMappings>(); }
额外注意事项
如果你的项目用到了自定义区域适配器,需要在MEF的导出标记里同时导出IRegionAdapter接口,并且在容器注册阶段批量扫描所有导出了该接口的类型注入到容器中,避免后续自定义适配器也出现解析失败的问题。
内容的提问来源于stack exchange,提问作者Sara
相关产品推荐
相关产品推荐

