gpt4 book ai didi

c# - 如何在 DI 中注册自定义 UserStore 和 UserManager

转载 作者:可可西里 更新时间:2023-11-01 08:08:15 28 4
gpt4 key购买 nike

这是我的设置:

public class ApplicationUser : IdentityUser<Guid>
{
}
public class ApplicationRole : IdentityRole<Guid>
{
}
public class ApplicationUserLogin : IdentityUserLogin<Guid>
{
}
public class ApplicationUserClaim : IdentityUserClaim<Guid>
{
}
public class ApplicationRoleClaim : IdentityRoleClaim<Guid>
{
}

这是我的 UserStore 的定义

public class ApplicationUserStore : UserStore<ApplicationUser, ApplicationRole, MyContext, Guid>
{
public ApplicationUserStore(MyContext context, IdentityErrorDescriber describer = null)
: base(context, describer)
{
}
}

这是我的 UserManager 的定义

public class ApplicationUserManager : UserManager<ApplicationUser>
{
public ApplicationUserManager(IUserStore<ApplicationUser> store, IOptions<IdentityOptions> optionsAccessor,
IPasswordHasher<ApplicationUser> passwordHasher, IEnumerable<IUserValidator<ApplicationUser>> userValidators,
IEnumerable<IPasswordValidator<ApplicationUser>> passwordValidators, ILookupNormalizer keyNormalizer,
IdentityErrorDescriber errors, IEnumerable<IUserTokenProvider<ApplicationUser>> tokenProviders,
ILoggerFactory logger, IHttpContextAccessor contextAccessor)
: base(
store, optionsAccessor, passwordHasher, userValidators, passwordValidators, keyNormalizer, errors,
tokenProviders, logger, contextAccessor)
{
}
}

这是我的 DbContext 的定义:

public class MyContext : IdentityDbContext<ApplicationUser, ApplicationRole, Guid>
{
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
}
}

这是我的 Startup.cs

    public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddMvc();

services.AddEntityFramework()
.AddSqlServer()
.AddDbContext<MyContext>(options => options.UseSqlServer(Configuration.Get("Data:DbConnection")));

services.AddIdentity<ApplicationUser, ApplicationRole>()
.AddEntityFrameworkStores<MyContext, Guid>()
.AddUserStore<ApplicationUserStore>()
.AddRoleStore<ApplicationRoleStore>()
.AddUserManager<ApplicationUserManager>()
.AddRoleManager<ApplicationRoleManager>()
.AddDefaultTokenProviders();

var builder = new ContainerBuilder();
builder.Populate(services);
var container = builder.Build();
return container.Resolve<IServiceProvider>();
}

此构造函数的依赖项将起作用:

public AccountController(UserManager<ApplicationUser> userManager, SignInManager<ApplicationUser> signInManager)

这个不会:

public AccountController(ApplicationUserManager userManager, SignInManager<ApplicationUser> signInManager)

有人知道我做错了什么吗?

最佳答案

DI 通常用于接口(interface)驱动的开发; .AddUserManager<ApplicationUserManager>()指定一个实现 UserManager<> ,而不是服务接口(interface)。这意味着它仍然期待你得到 UserManager<ApplicationUser>并且只能那样使用它;它会给你一个 ApplicationUserManager .

我假设您有其他方法想在您的 ApplicationUserManager 上使用. 如果没有,只需按其工作方式使用依赖构造函数并享受接口(interface)驱动的开发。如果是,您有 3 个选择:

  1. 通过组合而不是继承使用扩展。而不是从 UserManager<> 继承, 写 ApplicationUserManager作为包装类;您可以将其包含在构造函数中。这应该为您提供 ApplicationUserManager 中所需的所有功能。 .

  2. 自己将其按原样添加到 DI 框架中。这并不像听起来那么困难,因为 UserManager<>本身没有真正的状态:

    services.AddScoped<ApplicationUserManager>();

    这里的缺点是你实际上有两个 UserManager<>用户范围的对象;结果可能会导致效率低下。从目前代码的状态来看,我认为不是。

  3. 将其写为扩展方法。如果您有许多依赖项而不仅仅是 UserManager<>的基本功能,这可能真的很复杂。

关于c# - 如何在 DI 中注册自定义 UserStore 和 UserManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30453567/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com