PRISM处理缺失服务时模块初始化异常未被LoadModuleCompleted事件捕获咨询
问题根因
PRISM 8.x对IModuleManager的默认行为做了未在依赖注入解析错误文档中明确提及的调整:
- 仅按需动态加载的模块(显式调用
LoadModule()方法加载的模块)的加载/初始化异常会被内部捕获,送入LoadModuleCompleted事件的Error字段 - 应用启动时自动加载的模块,初始化阶段抛出的异常会直接向上冒泡,不会触发
LoadModuleCompleted事件,你遇到的ModuleInitializeException就是这个阶段抛出的未捕获异常
你参考的依赖注入解析错误文档主要覆盖通用的服务解析场景,未涉及模块加载阶段的特殊行为。
方案1:直接捕获启动模块初始化异常(最简实现)
不需要修改模块管理器逻辑,直接在你重写的InitializeModules外层加异常捕获即可:
protected override void InitializeModules() { var manager = Container.Resolve<IModuleManager>(); manager.LoadModuleCompleted += onModuleLoaded; try { manager.Run(); } catch (ModuleInitializeException ex) { // 可以直接从InnerException拿到ContainerResolutionException if (ex.InnerException is ContainerResolutionException resolutionException) { onContainerResolutionException(resolutionException); } // 按需选择是否继续抛出异常终止应用 // throw; } }
方案2:让启动加载模块也触发LoadModuleCompleted事件
如果需要统一用事件处理所有模块的加载结果,自定义继承ModuleManager替换默认实现即可:
- 自定义模块管理器实现
public class CustomModuleManager : ModuleManager { public CustomModuleManager(IModuleInitializer moduleInitializer, IModuleCatalog moduleCatalog, ILoggerFacade loggerFacade) : base(moduleInitializer, moduleCatalog, loggerFacade) { } protected override void LoadModulesThatAreReadyForLoad() { // 重写原有逻辑,捕获启动加载模块的异常,触发对应事件 foreach (var moduleInfo in ModuleCatalog.Modules.Where(m => m.State == ModuleState.ReadyForInitialization)) { try { LoadModule(moduleInfo); } catch (Exception ex) { OnLoadModuleCompleted(new LoadModuleCompletedEventArgs(moduleInfo, ex)); } } } }
- 在Prism应用类中替换默认的
IModuleManager注册:
protected override void RegisterTypes(IContainerRegistry containerRegistry) { containerRegistry.RegisterSingleton<IModuleManager, CustomModuleManager>(); // 其他注册逻辑 }
调整后不管是启动加载还是按需加载的模块,异常都会进入LoadModuleCompleted事件处理逻辑。
内容的提问来源于stack exchange,提问作者gavarial
相关产品推荐
相关产品推荐

