c# - AddTransient UserManager 在第二次从同一控制器调用时被处理
问题描述
我有一个带有控制器的 Asp.Net Core WebApi,该控制器将 2x 服务注入到构造函数中。
反过来,他们有我的DbContext
并UserManager<ApplicationUser>
注入他们。
有问题的端点创建一个用户,然后为用户创建一个密码重置令牌以设置密码(这将邮寄给用户)。
为了分离关注点,我的控制器中有以下代码;
//create the user
var response = await _signUpService.CreateNewUser(model);
//create the reset token
var token = await _userService.GeneratePasswordResetTokenAsync(response.Id);
每个方法如下,首先在SignUpService中;
private readonly Func<UserManager<ApplicationUser>> _userManagerFactory;
public async Task<ApplicationUser> CreateNewUser(UserModel model)
{
Func<Task<ApplicationUser>> func = async () =>
{
using (var context = _contextFactory())
using (var userManager = _userManagerFactory())
{
/*removed for brevity*/
return context.Save(model);
}
};
return await this.ExecuteAsync(func);
}
然后在用户服务中;
private readonly Func<UserManager<ApplicationUser>> _userManagerFactory;
public async Task<string> GeneratePasswordResetTokenAsync(int userId)
{
Func<Task<string>> func = async () =>
{
using (var context = _userManagerFactory())
{
var user = await context.FindByIdAsync(userId.ToString());
var token = await context.GeneratePasswordResetTokenAsync(user);
return token;
}
};
return await this.ExecuteAsync(func);
}
我添加依赖注入如下;
services.AddIdentity<ApplicationUser, ApplicationRole>()
.AddEntityFrameworkStores<MyDataContext>()
.AddDefaultTokenProviders();
services.AddTransient<Func<UserManager<ApplicationUser>>>(provider => () => provider.GetService<UserManager<ApplicationUser>>());
但是,在第二次使用时,即using (var context = _userManagerFactory())
出现以下错误;
无法访问已处置的对象。对象名称:'UserStore`9'。
现在我可以DbContext
在第二次通话时访问我的但不能访问UserManager<ApplicationUser>
?
据我所知,应该为每个服务添加UserManager<ApplicationUser>
(以及??)的实例?UserStore
但这似乎不是事实?
更新
我尝试更改以下内容以指定 WebApi 中的 deendency 注入Startup
。
services.AddIdentity<ApplicationUser, ApplicationRole>()
.AddEntityFrameworkStores<MyDataContext>()
.AddDefaultTokenProviders();
services.AddTransient<UserStore>();
services.AddTransient <UserManager<ApplicationUser>>();
services.AddTransient<Func<UserManager<ApplicationUser>>>(provider => () => provider.GetService<UserManager<ApplicationUser>>());
但这也引发了同样的错误。
解决方案
推荐阅读
- excel - 如何每次在特定时间自动运行 Excel 宏
- java - 如何将文件下载到下载文件夹等
- java - 骆驼如何将授权标头添加到休息路线?
- r - as.numeric 对列中的某些值无明显原因返回 NA
- python - 你好世界python程序在同一台机器上的两个版本python
- java - 当我尝试独立启动 JBOSS 时出现 SIGSEGV Java 致命错误
- r - 从 R 中的数据框中识别无意义或乱码文本。有没有办法将字符串/单词部分匹配到字典?
- apache-spark - 无法在python中以纱线集群模式读取jceks文件
- javascript - 如何在 HTML 中使用 2D 画布创建平滑路径?
- flutter - 下拉刷新WebView页面