项目
版本

找到的构造函数都无法调用

示例信息

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 默认会尝试使用能够从容器中满足最多参数的那个。如果你想,可以 指定一个不包含问题参数的构造函数

在本文档中