使用服务依赖注入实例化 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>();
我尝试使用 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>();