使用服务依赖注入实例化 MyViewModel 时出现 NullReferenceException

NullReferenceException when MyViewModel is instanciated with service dependency injection

我尝试使用 Catel 中使用服务的最佳方法,即在视图模型的构造函数中注入服务:

public MyViewModel(IMessageService msgService)
{
    Argument.IsNotNull(() => msgService);
    this.messageService = msgService;
    //stuff
}

然而,当我在这个构造函数中放入参数时,我的程序抛出一个 NullReferenceException,据推测是在 Argument.IsNoNull 行(通过 Catel 的代码进行调试似乎很痛苦)。当我删除参数或 IsNotNull 验证时,它启动正常。

所以我没有收到 IMessageService,msgService 始终为 null。 我究竟做错了什么?缺少程序集?


编辑: 似乎 IMessageService 类型已注册。我设法通过使用 ResolveType 获得参考:

messageService = ServiceLocator.Default.ResolveType<IMessageService>();

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

你试过吗?

Argument.IsNotNull("msgService", msgService);

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

类似

Argument的代码可以在Git上找到,用法是正确的,恐怕你得检查一下注入。尝试在构造函数中设置断点并遍历代码,直到到达断点。

您使用的是特殊的 DI 框架吗?是 - 然后检查 registration/setup 否则找到组成 ViewModel

的代码

我刚刚在 documentation 中看到类型是自动设置的。是否可以为您的服务创建对象图(是否存在任何循环依赖关系,或由于自身依赖关系或不匹配构造函数[=而无法创建的依赖关系20=]?)

如果你得到一个null,这意味着依赖无法解析。如果您使用的是 Catel 的默认 ServiceLocator,请启用日志记录以查看应用程序启动时的幕后情况:

#if DEBUG
    LogManager.AddDebugListener();
#endif

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

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