ASP.NET Core依赖注入解析问题:无法解析服务异常求助
嘿,这个依赖注入解析失败的问题我太熟了!咱们一步步来排查,大概率是下面几个地方没做对:
检查接口与实现类的注册是否完整
你提到有三个Repository类,那对应的接口是不是都在Startup的ConfigureServices里完成注册了?比如报错里的Data.Repositories.ITechniqueAssess...(推测是ITechniqueAssessmentRepository这类接口),你是不是漏了把它和对应的实现类绑定?比如应该加一行注册代码:services.AddScoped<ITechniqueAssessmentRepository, TechniqueAssessmentRepository>();要知道,DI容器只会解析你明确注册过的服务,漏一个都不行。
确认构造函数的依赖链是否完整注册
看看ITechniqueService的实现类(比如TechniqueService)的构造函数里,是不是注入了那个未被解析的ITechniqueAssess...接口?如果是的话,必须确保这个接口已经在Startup里完成注册,不然容器找不到对应的实现类来实例化。
举个例子,如果你的Service构造函数是这样的:public TechniqueService(ITechniqueAssessmentRepository assessRepo, IOtherRepository otherRepo) { // 业务逻辑代码 }那两个Repository接口都得在Startup里注册才行,缺一个都会导致解析失败。
检查命名空间和类名是否匹配
报错里的类型是Data.Repositories.ITechniqueAssess...,你得确认Startup里注册的是不是同一个命名空间下的接口和实现?有没有可能不小心引用了错误的命名空间,导致容器找不到对应的类型?确认服务生命周期是否无冲突
比如你如果把Repository注册为Singleton,但Service是Scoped,虽然一般不会直接导致解析失败,但有时候嵌套依赖的生命周期冲突也可能引发问题。建议Repository用Scoped(和Web请求生命周期一致),Service也对应使用Scoped或者Transient。检查控制器构造函数的依赖
控制器的构造函数里是不是直接注入了那个未解析的Repository?如果是的话,同样要确保它已经注册。不过通常更推荐控制器注入Service而非直接注入Repository,如果是前者的话,回到前面的Service依赖链检查即可。
你可以先把那个报错的接口和实现类单独注册到Startup里,再运行试试。如果还是报错,把ITechniqueService实现类构造函数里的所有依赖列出来,逐一检查每个依赖是否都已注册。
另外,也可以在Startup里注册完所有服务后,手动尝试从容器解析报错的类型,快速定位问题:
var serviceProvider = services.BuildServiceProvider(); var targetRepo = serviceProvider.GetService<ITechniqueAssessmentRepository>(); // 如果targetRepo是null,那肯定是注册环节出了问题
内容的提问来源于stack exchange,提问作者mnu-nasir

