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

Caliburn.Micro调用ViewModel异步方法时Simple Injector抛出异常怎么解决?

问题原因

  • Caliburn.Micro处理返回Task的异步视图模型方法时,会内部创建SequentialResult实例包装异步执行逻辑,创建完成后会自动调用Bootstrapper.BuildUp方法尝试为该实例完成属性注入
  • Simple Injector v5+版本默认关闭了未注册具体类型的隐式解析能力,你原有BuildUp方法对所有传入实例都会尝试从容器中查找注册信息,而SequentialResult是Caliburn内部运行时生成的类型,不会提前注册到容器中,因此触发报错
  • 手动注册SequentialResult无效的原因是该类型的构造参数IEnumerator<IResult>是Caliburn运行时传入的动态参数,无法由容器提供,注册后容器校验阶段就会直接报错
  • 仅注释BuildUp方法不生效的核心原因是不同版本Caliburn.Micro的内部逻辑存在差异,部分版本在BuildUp为空实现时仍会触发容器的隐式解析逻辑

解决方案

修改你Bootstrapper中的BuildUp方法,跳过Caliburn内部类型的注入处理,仅对容器中已注册的业务类型执行初始化逻辑,不需要注册SequentialResult相关类型,修改后的代码如下:

protected override void BuildUp(object instance)
{
    // 跳过Caliburn.Micro内部的IResult系列类型,不需要容器进行注入
    if (instance is IResult)
        return;
        
    // 仅当实例类型已在容器中注册时,才执行初始化操作
    var registration = _container.GetRegistration(instance.GetType(), false);
    if (registration != null)
    {
        registration.Registration.InitializeInstance(instance);
    }
}

修改完成后直接运行项目即可,异步方法可以正常执行,不需要改为同步实现,同时也保留了Simple Injector对你自己的业务类的属性注入能力。

内容的提问来源于stack exchange,提问作者NM van Strien

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 17:45:09