.NET依赖注入启动异常:ITherapistServices服务描述符验证失败
嘿,看了你的代码和异常信息,问题很明确——你的TherapistServices构造函数里依赖的是具体类NotificationService,但DI容器只知道你注册了INotificationService接口到NotificationService的映射,找不到直接请求NotificationService的注册,所以启动时才会抛这个无法解析依赖的异常。
具体哪里出问题了?
先看你的TherapistServices构造函数:
public TherapistServices(IUnitOfWorkRepository unitWork, NotificationService notificationService) { _unitWork = unitWork; _notificationService = notificationService; }
你在服务注册的时候,只加了这一行:
services.AddTransient<INotificationService, NotificationService>();
这行代码告诉DI容器:当需要INotificationService接口时,给我一个NotificationService的实例。但你的构造函数直接要的是NotificationService这个具体类,容器没收到过这个类型的注册请求,自然不知道怎么给你实例化它。
怎么修复?
推荐用第一种方法,完全符合依赖注入的最佳实践:
方法1:把构造函数依赖改成接口(首选)
把构造函数里的NotificationService换成INotificationService接口就行,和你注册的服务对应上:
public TherapistServices(IUnitOfWorkRepository unitWork, INotificationService notificationService) { _unitWork = unitWork; _notificationService = notificationService; }
这样做不仅能解决当前问题,还能降低类之间的耦合,以后要换NotificationService的实现也更方便,测试的时候还能轻松mock这个接口。
方法2:额外注册具体类(不推荐)
如果你非要在构造函数里依赖具体类,那就在服务扩展里加一行注册NotificationService的代码:
public static IServiceCollection AddServices(this IServiceCollection services, string ConnectionString) { services.AddRepository(ConnectionString); services.AddTransient<INotificationService, NotificationService>(); // 额外注册具体类 services.AddTransient<NotificationService>(); services.AddTransient<ITherapistServices, TherapistServices>(); return services; }
不过真心不建议这么做,这会让TherapistServices和NotificationService紧耦合,违背了依赖倒置原则,后续维护起来会麻烦。
额外要检查的点
别忘了确认IUnitOfWorkRepository已经通过services.AddRepository(ConnectionString)正确注册了,如果这个接口的实现没注册,也会触发类似的解析异常哦。
内容的提问来源于stack exchange,提问作者Vipin Jha




