ASP.NET Core DI报错:Scoped服务无法构造 无法解析依赖类型
问题相关代码
UserManager服务实现
public class UserManagerService : IUserManagerService { private readonly UserManager<UserModel> userManager; private readonly UserServiceHelper userServiceHelper; public UserManagerService(UserManager<UserModel> _userManager) { this.userManager = _userManager; userServiceHelper = new UserServiceHelper(); } public async Task<bool> CreateUser(UserViewModel user) { try { var new_user = userServiceHelper.GetNewItems(user); await userManager.CreateAsync(new_user); return true; } catch(Exception e) { throw; } } }
IUsermanagerServices接口定义代码如下:
public interface IUsermanagerServices { Task<bool> CreateUser(UserViewModel user); Task<bool> CreateUserBatch(List<UserViewModel> users); Task<bool> DeleteUser(UserViewModel user); }
UserApiController控制器代码
[Route("api/[controller]")] [ApiController] public class UserApiController : ControllerBase { private readonly IUserManagerService userManager; public UserApiController(IUserManagerService _userManager) { userManager = _userManager; } [HttpPost] public async Task<IActionResult> Post([FromBody] List<UserViewModel> users) { try { var _result = await userManager.CreateUserBatch(users); var _response = new ResponseModel<bool>() { Content = _result, Message = "np" }; return Ok(_response); } catch(Exception e) { var _response = new ResponseModel<bool>() { Content = false, ExceptionMessage = e.Message, HasError = true }.ToString(); return Problem(_response); } } }
服务注册扩展方法代码
public static void AddUserManagerServices(this IServiceCollection services) { services.AddScoped<IUserManagerService, UserManagerService>(); }
Program.cs启动配置代码
#region builder.Services.AddUserManagerServices(); #endregion var app = builder.Build();
报错信息
执行构建WebApplication实例的代码时抛出如下异常:
Some services are not able to be constructed (Error while validating the service descriptor 'ServiceType: Lifetime: Scoped ImplementationType: Unable to resolve service for type while attempting to activate)
问题原因
这个是.NET依赖注入容器验证服务时抛出的错误,核心原因有3个:
- 未注册ASP.NET Core Identity核心服务。
UserManager<UserModel>是Identity库提供的内置服务,仅注册自定义的IUserManagerService、没有添加Identity相关服务配置的情况下,DI容器无法解析UserManager<UserModel>实例,直接导致UserManagerService构造失败。 - 接口命名、定义不统一。定义的接口名是
IUsermanagerServices(名称带s,大小写不匹配),但服务实现、控制器注入用的是IUserManagerService,二者类型不匹配;同时UserManagerService没有实现接口声明的CreateUserBatch、DeleteUser方法,即使DI验证通过,运行时也会抛出方法未实现的异常。 - 依赖处理不规范。
UserServiceHelper直接在构造函数中手动实例化,没有纳入DI容器管理,后续如果该类有自己的依赖,会再次出现无法解析服务的问题。
修复方案
按以下步骤逐一修改即可解决问题:
- 第一步:注册ASP.NET Core Identity服务。确保项目已经引用了
Microsoft.AspNetCore.Identity.EntityFrameworkCoreNuGet包,且UserModel继承自Identity的基类IdentityUser,业务数据库上下文继承自IdentityDbContext。之后在Program.cs中,在调用AddUserManagerServices()之前添加Identity服务注册:
// 替换AppDbContext为你自己的数据库上下文类 builder.Services.AddIdentity<UserModel, IdentityRole>() .AddEntityFrameworkStores<AppDbContext>() .AddDefaultTokenProviders(); builder.Services.AddUserManagerServices();
- 第二步:统一接口定义。修正接口名称为
IUserManagerService(和实现类、注入的类型名完全一致),并在UserManagerService中补全CreateUserBatch、DeleteUser两个方法的实现。 - 第三步:将
UserServiceHelper纳入DI管理。修改服务注册扩展方法,添加UserServiceHelper的注册:
public static void AddUserManagerServices(this IServiceCollection services) { services.AddScoped<UserServiceHelper>(); services.AddScoped<IUserManagerService, UserManagerService>(); }
同时修改UserManagerService的构造函数,通过注入获取UserServiceHelper实例,去掉手动new的代码:
public UserManagerService(UserManager<UserModel> _userManager, UserServiceHelper _userServiceHelper) { this.userManager = _userManager; userServiceHelper = _userServiceHelper; }
内容的提问来源于stack exchange,提问作者hediye jamili
相关产品推荐
相关产品推荐

