在内置依赖注入系统之外创建UserManager

时间:2016-07-07 19:16:03

标签: asp.net-core identity

这是使用带有身份和实体框架核心的asp.net核心。我在saas应用程序上工作,我有一个单独的管理Web应用程序,您可以在其中添加新的租户到系统。创建租户后,应用程序会为新租户创建默认数据库(每个租户设置的数据库)。我想在这个新数据库中添加一个默认用户,但我很难在依赖注入系统之外创建用户管理器。

管理员网络应用程序使用在startup.cs中创建的用户管理器(通过内置的DI系统)作为管理员应用程序的管理器。当我将用户添加到新租户数据库时,我没有使用DI系统,我只想创建一个UserManager,其IdentityDbContext与新租户数据库的连接字符串相关联。

我在管理员应用中创建新租户后使用此功能:

public class TenantDbInitializer
{
    private Tenant tenant;
    private ApplicationDbContext context;

    private UserManager<ApplicationUser> userManager;

    public TenantDbInitializer(Tenant tenant)
    {
        this.tenant = tenant;
    }

    public void Init()
    {
        // tenant contains connection string
        context = new ApplicationDbContext(tenant); 

        var userStore = new UserStore<ApplicationUser>(context);

        userManager = new UserManager<ApplicationUser>(.........
    }
}

UserManager构造参数包含我无法找到应该使用的实例示例的项目。一些接口似乎具有默认实现,但我不确定这是否是继续(或传递null)的方式。构造函数是:

    public UserManager(IUserStore<TUser> store,
        IOptions<IdentityOptions> optionsAccessor,
        IPasswordHasher<TUser> passwordHasher,
        IEnumerable<IUserValidator<TUser>> userValidators,
        IEnumerable<IPasswordValidator<TUser>> passwordValidators,
        ILookupNormalizer keyNormalizer,
        IdentityErrorDescriber errors,
        IServiceProvider services,
        ILogger<UserManager<TUser>> logger)

查看身份来源,似乎我可以为其中一些参数传递null,但我想确保我理解这里发生了什么,所以我不会做错任何事情。

用户管理器的来源是: https://github.com/aspnet/Identity/blob/dev/src/Microsoft.AspNetCore.Identity/UserManager.cs

谢谢, 布赖恩

3 个答案:

答案 0 :(得分:6)

查看标识源后,您可以传入空值以获得正确的结果。应该先试试这个。

答案 1 :(得分:0)

我认为您应该至少拥有UserStore:

 UserStore<ApplicationUser> _userStore = new UserStore<ApplicationUser>(context, null);
 Mock<ILogger<UserManager<ApplicationUser>>> mockLogger = null;
 mockLogger = new Mock<ILogger<UserManager<ApplicationUser>>>();

我嘲笑记录器。

答案 2 :(得分:0)

以这种方式解决问题

static IUserStore<ApplicationUser> _store = new UserStore<ApplicationUser>(new context()); 
static UserManager<ApplicationUser> _userManager = new UserManager<ApplicationUser>(_store, null, new PasswordHasher<ApplicationUser>(), null, null, null, null, null, null);