NullReferenceException 当 MyViewModel 使用服务依赖关系注入实例化时
本文关键字:关系 注入 实例化 依赖 服务 MyViewModel NullReferenceException | 更新日期: 2023-09-27 18:37:21
我尝试使用在 Catel 中使用服务的最佳方法,即在视图模型的构造函数中注入服务:
public MyViewModel(IMessageService msgService)
{
Argument.IsNotNull(() => msgService);
this.messageService = msgService;
//stuff
}
然而,当我在这个构造函数中放置参数时,我的程序抛出了一个 NullReferenceException,据说是在 Argument.IsNoNull 行(通过 Catel 的代码进行调试似乎很痛苦)。当我删除参数或 IsNotNull 验证时,它会启动正常。
所以我没有收到IMessageService,msgService总是为空。我做错了什么?缺少程序集?
编辑:似乎已注册IMessageService类型。我设法通过使用解析类型获取参考:
messageService = ServiceLocator.Default.ResolveType<IMessageService>();
因此,就我的项目而言,问题已经解决了。但它没有回答最初的问题:为什么依赖注入不起作用?
如果得到 null,则表示无法解析依赖项。如果您使用的是 Catel 的默认服务定位器,请启用日志记录以查看应用程序启动过程中的幕后情况:
#if DEBUG
LogManager.AddDebugListener();
#endif
还可以使用此代码检查类型是否已注册:
var serviceLocator = ServiceLocator.Default;
serviceLocator.IsTypeRegistered<IMessageService>();
你试过这个吗?
Argument.IsNotNull("msgService", msgService);
在文档视频中,他们与Argument.ArgumentIsNullOrWhitespace类似。
参数的代码可以在 Git 上找到,用法是正确的,我担心你必须检查注入。尝试在构造函数中设置断点并遍历代码,直到到达断点。
您是否正在使用特殊的DI框架?是 - 然后检查注册/设置,否则找到组成 ViewModel
的代码我刚刚在文档中看到类型是自动设置的。是否可以为您的服务创建对象图(是否有任何循环依赖项,或由于自己的依赖项或不匹配构造函数而无法创建的依赖项?