gpt4 book ai didi

c# - 如何将 DI 与 UserManager 和 UserStore 结合使用

转载 作者:太空狗 更新时间:2023-10-30 01:30:58 27 4
gpt4 key购买 nike

给定 MVC Controller 构造函数的典型设置,将 UserManager(采用 UserStore)传递给它的父类,如何将其转换为通过 IoC 注入(inject)?

从这里开始:

public AccountController()
: this(new UserManager<ApplicationUser>(
new UserStore<ApplicationUser>(new ApplicationDbContext())))
{
}

我会这样想:

public AccountController(IUserStore store)
: this(new UserManager<ApplicationUser>(store)))
{
}

当然,这确实会丢失 IdentityDbContext

应该如何设置 IoC 以及应该如何定义构造函数以允许注入(inject) UserManager、UserStore 和 IdentityDbContext?

最佳答案

您需要创建一些类以便于注入(inject)。

让我们从 UserStore 开始。创建所需的接口(interface)并让它继承自 IUserStore<ApplicationUser>

public IUserStore : IUserStore<ApplicationUser> { }

创建一个实现如下。

public ApplicationUserStore : UserStore<ApplicationUser>, IUserSTore {
public ApplicationUserStore(ApplicationDbContext dbContext)
:base(dbContext) { }
}

然后可以根据需要在 OP 中完成 UserManager。

public class ApplicationUserManager : UserManager<ApplicationUser> {

public ApplicationUserManager(IUserSTore userStore) : base(userStore) { }

}

现在剩下的就是确保您决定使用的任何 IoC 容器都注册了必要的类。

ApplicationDbContext --> ApplicationDbContext 
IUserStore --> ApplicationUserStore

如果您想更进一步并抽象 UserManager,则只需创建一个接口(interface)来公开您想要的功能

public interface IUserManager<TUser, TKey> : IDisposable
where TUser : class, Microsoft.AspNet.Identity.IUser<TKey>
where TKey : System.IEquatable<TKey> {
//...include all the properties and methods to be exposed
IQueryable<TUser> Users { get; }
Task<TUser> FindByEmailAsync(string email);
Task<TUser> FindByIdAsync(TKey userId);
//...other code removed for brevity
}

public IUserManager<TUser> : IUserManager<TUser, string>
where TUser : class, Microsoft.AspNet.Identity.IUser<string> { }

public IApplicationUserManager : IUserManager<ApplicationUser> { }

并让您的经理从中继承。

public class ApplicationUserManager : UserManager<ApplicationUser>, IApplicationUserManager {

public ApplicationUserManager(IUserSTore userStore) : base(userStore) { }

}

这意味着 Controller 现在可以依赖于抽象而不是实现问题

private readonly IApplicationUserManager userManager;

public AccountController(IApplicationUserManager userManager) {
this.userManager = userManager;
}

然后您再次在 IoC 容器中向实现注册接口(interface)。

IApplicationUserManager  --> ApplicationUserManager 

更新:

如果您喜欢冒险并想抽象身份框架本身,请查看 answer given here

关于c# - 如何将 DI 与 UserManager 和 UserStore 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41883635/

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