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
相关产品推荐
相关产品推荐

