找到的构造函数都无法调用
示例信息
None of the constructors found on type 'MyApp.MyComponent' can be invoked
with the available services and parameters:
Cannot resolve parameter 'MyApp.IMyDependency myDep' of constructor
'Void .ctor(MyApp.IMyDependency)'.
这个错误意味着 Autofac 尝试使用构造函数来实例化一个组件,但构造函数中列出的依赖项中,容器无法从其中解析出任何。消息中会告诉你哪些参数无法被解析。
在示例信息中,我们能看到:
- 被创建的类是
MyApp.MyComponent
。 MyApp.MyComponent
类正在使用签名为Void .ctor(MyApp.IMyDependency)
的构造函数(单参数构造函数)进行创建。- 类型为
MyApp.IMyDependency
的参数没有在 Autofac 容器中注册。
解决问题
这种情况通常有以下原因:
首先,参数类型可能代表了一个尚未正确注册到容器中的服务。 在上面的例子中,可能是 MyApp.IMyDependency
没有被注册,因此无法作为其他组件的依赖。试着在测试中手动解决该服务。例如,你可以尝试调用 container.Resolve<MyApp.IMyDependency>()
来查看情况。你可能认为它已经注册了,但实际上并没有。
其次,在服务的依赖项解析过程中出现了错误。 在上述例子中,可能是 MyApp.IMyDependency
构造函数中的逻辑遇到了问题。阅读内部异常以获取更多关于问题的确切原因的信息。
最后,你的构造函数中可能存在一个实际上不是服务的参数,容器中不会包含它。 例如,通常不会将纯字符串或整数值注册到容器中,但如果构造函数需要这样的值,它将无法运行。在这种情况下,可以在注册时指定 Parameter <parameters-with-reflection-components>
提供额外参数。我们还有一篇关于 注入配置参数(如连接字符串或环境变量)的 FAQ 可能对你有所帮助。
如果组件有多个构造函数,Autofac 默认会尝试使用能够从容器中满足最多参数的那个。如果你想,可以 指定一个不包含问题参数的构造函数 。