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>();
因此,就

我的项目而言,问题已经解决了。但它没有回答最初的问题:为什么依赖注入不起作用?

NullReferenceException 当 MyViewModel 使用服务依赖关系注入实例化时

如果得到 null,则表示无法解析依赖项。如果您使用的是 Catel 的默认服务定位器,请启用日志记录以查看应用程序启动过程中的幕后情况:

#if DEBUG
    LogManager.AddDebugListener();
#endif

还可以使用此代码检查类型是否已注册:

var serviceLocator = ServiceLocator.Default;
serviceLocator.IsTypeRegistered<IMessageService>();

你试过这个吗?

Argument.IsNotNull("msgService", msgService);

在文档视频中,他们与Argument.ArgumentIsNullOrWhitespace类似。

参数的代码可以在 Git 上找到,用法是正确的,我担心你必须检查注入。尝试在构造函数中设置断点并遍历代码,直到到达断点。

您是否正在使用特殊的DI框架?是 - 然后检查注册/设置,否则找到组成 ViewModel

的代码

我刚刚在文档中看到类型是自动设置的。是否可以为您的服务创建对象图(是否有任何循环依赖项,或由于自己的依赖项或不匹配构造函数而无法创建的依赖项