MyViewModel与服务依赖项注入实例化时的NullReferenceException

时间:2015-01-12 09:31:15

标签: c# wpf mvvm service catel

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

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>();

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

3 个答案:

答案 0 :(得分:3)

如果您获得 null ,则表示无法解析依赖关系。如果您使用的是Catel的默认 ServiceLocator ,请启用日志记录以查看应用程序启动过程中的内容:

#if DEBUG
    LogManager.AddDebugListener();
#endif

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

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

答案 1 :(得分:0)

你试过这个吗?

Argument.IsNotNull("msgService", msgService);

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

答案 2 :(得分:0)

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

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

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