You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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替换默认实现即可:

  1. 自定义模块管理器实现
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));
            }
        }
    }
}
  1. 在Prism应用类中替换默认的IModuleManager注册:
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
    containerRegistry.RegisterSingleton<IModuleManager, CustomModuleManager>();
    // 其他注册逻辑
}

调整后不管是启动加载还是按需加载的模块,异常都会进入LoadModuleCompleted事件处理逻辑。


内容的提问来源于stack exchange,提问作者gavarial

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 15:24:07