ASP.NET Core激活UserController时无法解析ApplicationUser服务报错
问题描述
开发用户个人资料页时触发未处理异常,错误信息如下:
InvalidOperationException: Unable to resolve service for type 'Website_friend_feature.Areas.Identity.Data.ApplicationUser' while attempting to activate 'Website_friend_feature.Controllers.UserController'.
已配置AuthDbContext数据库上下文与身份认证、授权中间件,参照公开方案排查未解决问题,怀疑视图模型调用存在错误。
错误原因
报错和视图模型调用无关,是依赖注入配置存在两个明确问题:
- 你在
UserController构造函数中直接注入了ApplicationUser类型,ApplicationUser是对应用户数据的实体类,从未被注册到依赖注入容器中,容器无法为其解析实例,这是触发本次InvalidOperationException的直接原因。你之前查到的配置Identity服务的方案只覆盖了第二个问题,没有处理这个直接注入实体的错误,所以修改后仍然报错。 - 你仅在Startup中配置了数据库上下文、认证授权中间件,没有注册Identity核心服务,后续即使解决了第一个问题,
UserManager<ApplicationUser>也会出现解析失败的问题。
修复方案
按以下步骤调整代码即可:
- 移除控制器构造函数中对
ApplicationUser的全局注入。实体类不需要注册到DI容器,也不适合做全局注入——每次请求对应的用户数据是动态查询得到的,全局注入固定的实体实例会引发数据混乱、并发错误。你需要的用户实例,都可以通过UserManager在具体Action中查询获取。
修正后的控制器基础代码参考:using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using System.Security.Claims; using System.Threading.Tasks; using Website_friend_feature.Areas.Identity.Data; namespace Website_friend_feature.Controllers { public class UserController : Controller { private readonly UserManager<ApplicationUser> _userManager; public UserController (UserManager<ApplicationUser> userManager) { _userManager = userManager; } // 个人资料页Action示例 public async Task<IActionResult> Profile() { // 获取当前登录用户ID,查询对应用户实体 var userId = User.FindFirstValue(ClaimTypes.NameIdentifier); var user = await _userManager.FindByIdAsync(userId); // 将用户数据传递给视图展示 return View(user); } } } - 在Startup.cs的
ConfigureServices方法中补全Identity服务注册,替换原来单独注册DbContext的代码段:public void ConfigureServices(IServiceCollection services) { services.AddControllersWithViews(); services.AddRazorPages(); services.AddDbContext<AuthDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("AuthDbContextConnection"))); // 注册Identity服务,绑定用户实体与数据库上下文 services.AddDefaultIdentity<ApplicationUser>(options => { options.SignIn.RequireConfirmedAccount = false; // 可根据自身业务需求调整配置项 }) .AddEntityFrameworkStores<AuthDbContext>(); } - 调整完成后重新生成项目,再启动访问用户资料页即可解决服务解析报错。
注意点
不要将EF Core实体类注册到依赖注入容器,这类类型代表单条数据记录,生命周期随查询结果动态生成,所有数据操作都应该通过对应的服务(比如UserManager、DbContext)来完成。
内容的提问来源于stack exchange,提问作者roger blinkins
相关产品推荐
相关产品推荐

