首页 > 解决方案 > AddTransient UserManager 在第二次从同一控制器调用时被处理

问题描述

我有一个带有控制器的 Asp.Net Core WebApi,该控制器将 2x 服务注入到构造函数中。

反过来,他们有我的DbContextUserManager<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>>());

但这也引发了同样的错误。

标签: c#asp.net-core

解决方案


推荐阅读