Plugin未注入Resource:依赖注入失败引发空引用异常
解决MORYX Framework中Resource插件注入失败的问题
问题分析
你定义的FooDriver资源类通过DependencyRegistration特性声明了依赖,但在资源创建后,StatusCheck和ConnectionAttempt属性仍为空,说明依赖注入未正常生效。
排查与修复步骤
1. 修正DependencyRegistration特性的参数格式
原代码中特性的参数写法有误,第二个参数使用了数组形式,不符合该特性的参数要求,这很可能是注入失败的直接原因。正确写法应将每个依赖类型作为单独参数传入:
[ResourceRegistration, DependencyRegistration(typeof(IConnectionAttempt), typeof(IStatusCheck))] public class FooDriver : Driver { // 预期依赖注入 public IStatusCheck StatusCheck { get; set; } public IConnectionAttempt ConnectionAttempt { get; set; } ... }
2. 确认依赖实现类的注册状态
确保IConnectionAttempt和IStatusCheck的具体实现类已被框架正确注册:
- 实现类需带有
[Plugin]特性(如[Plugin(LifeCycle.Singleton)]),明确其插件身份 - 实现类所在的模块需带有
[Module]特性,且该模块已在框架启动配置中启用
3. 切换为构造函数注入(更可靠的方式)
如果属性注入仍存在问题,推荐使用构造函数注入,这是框架更优先支持的依赖注入方式,无需额外特性声明:
[ResourceRegistration] public class FooDriver : Driver { public IStatusCheck StatusCheck { get; } public IConnectionAttempt ConnectionAttempt { get; } public FooDriver(IStatusCheck statusCheck, IConnectionAttempt connectionAttempt) { StatusCheck = statusCheck; ConnectionAttempt = connectionAttempt; } ... }
4. 验证资源创建流程的注入配置
部分特殊场景下,资源创建流程可能需要显式启用属性注入,需检查框架配置中是否开启了资源的属性注入支持。
内容的提问来源于stack exchange,提问作者1nf0rmagician




