C# 当MyViewModel与服务依赖项注入实例关联时出现NullReferenceException

C# 当MyViewModel与服务依赖项注入实例关联时出现NullReferenceException,c#,wpf,mvvm,service,catel,C#,Wpf,Mvvm,Service,Catel,我尝试使用Catel中使用服务的最佳方法,即在viewmodel的构造函数中注入服务: public MyViewModel(IMessageService msgService) { Argument.IsNotNull(() => msgService); this.messageService = msgService; //stuff } 然而,当我在这个构造函数中放入参数时,我的程序抛出了一个NullReferenceException,应该是在Argu

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

public MyViewModel(IMessageService msgService)
{
    Argument.IsNotNull(() => msgService);
    this.messageService = msgService;
    //stuff
}
然而,当我在这个构造函数中放入参数时,我的程序抛出了一个NullReferenceException,应该是在Argument.IsNoNull行(通过Catel的代码进行调试似乎很痛苦)。当我删除参数或IsNotNull验证时,它将正常启动

所以我没有收到IMessageService,msgService总是空的。 我做错了什么?缺少组件


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

messageService = ServiceLocator.Default.ResolveType<IMessageService>();
messageService=ServiceLocator.Default.ResolveType();
就我的项目而言,问题已经解决了。但是它没有回答最初的问题:为什么依赖注入不起作用?

你试过这个吗

Argument.IsNotNull("msgService", msgService);
在文档视频中,他们对Argument.ArgumentIsNullOrWhitespace做了类似的操作。您尝试过这个吗

Argument.IsNotNull("msgService", msgService);
在文档视频中,他们对Argument.ArgumentIsNullOrWhitespace做了类似的操作。您尝试过这个吗

Argument.IsNotNull("msgService", msgService);
在文档视频中,他们对Argument.ArgumentIsNullOrWhitespace做了类似的操作。您尝试过这个吗

Argument.IsNotNull("msgService", msgService);

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

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

您使用的是特殊的DI框架吗?是-然后检查注册/设置,否则查找构成ViewModel的代码


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

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

您使用的是特殊的DI框架吗?是-然后检查注册/设置,否则查找构成ViewModel的代码


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

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

您使用的是特殊的DI框架吗?是-然后检查注册/设置,否则查找构成ViewModel的代码


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

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

您使用的是特殊的DI框架吗?是-然后检查注册/设置,否则查找构成ViewModel的代码

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

如果获得空值,则表示无法解析依赖项。如果您使用的是Catel的默认ServiceLocator,请启用日志记录以查看应用程序启动时引擎盖下的情况:

#if DEBUG
    LogManager.AddDebugListener();
#endif
您还可以使用以下代码检查类型是否已注册:

var serviceLocator = ServiceLocator.Default;
serviceLocator.IsTypeRegistered<IMessageService>();
var-serviceLocator=serviceLocator.Default;
serviceLocator.IsTypeRegistered();
如果得到空值,则表示无法解析依赖关系。如果您使用的是Catel的默认ServiceLocator,请启用日志记录以查看应用程序启动时引擎盖下的情况:

#if DEBUG
    LogManager.AddDebugListener();
#endif
您还可以使用以下代码检查类型是否已注册:

var serviceLocator = ServiceLocator.Default;
serviceLocator.IsTypeRegistered<IMessageService>();
var-serviceLocator=serviceLocator.Default;
serviceLocator.IsTypeRegistered();
如果得到空值,则表示无法解析依赖关系。如果您使用的是Catel的默认ServiceLocator,请启用日志记录以查看应用程序启动时引擎盖下的情况:

#if DEBUG
    LogManager.AddDebugListener();
#endif
您还可以使用以下代码检查类型是否已注册:

var serviceLocator = ServiceLocator.Default;
serviceLocator.IsTypeRegistered<IMessageService>();
var-serviceLocator=serviceLocator.Default;
serviceLocator.IsTypeRegistered();
如果得到空值,则表示无法解析依赖关系。如果您使用的是Catel的默认ServiceLocator,请启用日志记录以查看应用程序启动时引擎盖下的情况:

#if DEBUG
    LogManager.AddDebugListener();
#endif
您还可以使用以下代码检查类型是否已注册:

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

两者都是相同的,没什么大不了的。但是当我查看Git上的源代码时,我没有看到一个带有一个参数的方法调用。好的,我知道我必须在这个分部类[link]()中查找,您有Argument.cs=>normal检查和Argument.expression.cs=>expression检查。请看,不会有太大变化,我只在定义msgService时得到NullReferenceException,因此它是null引用。这里的检查只是针对这个事实。两者都是相同的,没什么大不了的。但是当我查看Git上的源代码时,我没有看到一个带有一个参数的方法调用。好的,我明白了,我必须查看这个分部类[link](),你有Argument.cs=>normal检查a