我尝试使用最好的方法在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>();
就我的项目而言,问题已经解决了。但它没有回答原来的问题:为什么依赖注入不起作用?
答案 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>