如何将DI与UserManager和UserStore一起使用



给定一个MVC控制器构造函数的典型设置,该构造函数将UserManager(接受UserStore)传递到其父类,如何将其转换为通过IoC注入?

从这个开始:

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

我会这样想:

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

当然,尽管这确实会失去IdentityDbContext

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

您需要创建一些类来简化注入。

让我们从UserStore开始。创建所需的接口并使其继承自IUserStore<ApplicationUser>

public IUserStore : IUserStore<ApplicationUser> { }

创建一个实现,如下所示。

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

然后,用户管理器可以根据需要在OP中完成。

public class ApplicationUserManager : UserManager<ApplicationUser> {
public ApplicationUserManager(IUserSTore userStore) : base(userStore) { }
}

所以现在剩下的就是确保您决定使用的IoC容器注册必要的类。

ApplicationDbContext --> ApplicationDbContext 
IUserStore --> ApplicationUserStore 

如果你想更进一步,抽象UserManager,那么只需创建一个接口,公开你想要的功能

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) { }
}

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

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

您再次在IoC容器中注册接口和实现。

IApplicationUserManager  --> ApplicationUserManager 

更新:

如果你有冒险精神,想抽象身份框架本身,看看这里给出的答案

相关内容

  • 没有找到相关文章

最新更新