You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

.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; 
}

不过真心不建议这么做,这会让TherapistServicesNotificationService紧耦合,违背了依赖倒置原则,后续维护起来会麻烦。

额外要检查的点

别忘了确认IUnitOfWorkRepository已经通过services.AddRepository(ConnectionString)正确注册了,如果这个接口的实现没注册,也会触发类似的解析异常哦。

内容的提问来源于stack exchange,提问作者Vipin Jha

火山引擎 最新活动