那里的事情相当复杂,本来可以更容易的。
UserManger 是 ... 经理。它并不真正与存储、数据库交互。
这就是UserStore 所做的。
事实上,UserManager 有一个constructor,它需要一个 UserStore。
为什么您必须使用不同的对象来管理用户?
嗯,主要原因是您可以决定不使用 EF 并创建自己的用户存储。
当您尝试实现自己的存储提供程序时,事情会变得更加清晰。
我做到了,我的代码可以从github 下载。
这是UserManager。正如你所看到的,里面没有太多东西。只需几行代码即可配置验证器。
UserStore 相反,相当大。在那个例子中,我实现了一些接口并覆盖了一些方法。
如果您想自定义与数据库的交互和/或扩展您的类,您会这样做。
您通常不会与UserStore 互动,事实上它是隐藏的。您只需创建它并将其传递给UserManager,然后......忘记它。
您始终可以自定义您的 UserManager 并公开 UserStore:
public class UserManager : UserManager<User, int>
{
public UserManager(IUserStore<User, int> store): base(store)
{
this.Store = store;
}
public IUserStore<User, int> Store { get; set; }
}
并且,也许,oververide 一些方法:
public class UserManager : UserManager<User, int>
{
public UserManager(IUserStore<User, int> store): base(store)
{
this.Store = store;
}
public IUserStore<User, int> Store { get; set; }
public override System.Threading.Tasks.Task<IdentityResult> CreateAsync(User user)
{
return base.CreateAsync(user);
}
}
但除非您必须进行一些特殊的自定义,否则这将毫无意义。
假设您想使用商店而不是经理来创建用户。你可以这样做:
await this.UserManager.Store.CreateAsync(new Custom.Identity.User() { UserName = "LeftyX" });
它会起作用的。
如您所见,在上面的课程中,我已经覆盖了 UserManager 中的 CreateAsync。
该方法调用UserStore.CreateAsync(),实际上,您必须调用基方法 CreateAsync:
public override System.Threading.Tasks.Task<IdentityResult> CreateAsync(User user)
{
return base.CreateAsync(user);
}
如果您不这样做,例如返回 null,则不会调用 UserStore.CreateAsync,也不会创建用户。
最后说得通。
我想了解这个框架如何工作的最好方法是尝试使用您自己的存储来自定义/实现您的解决方案,并查看所有类如何相互交互。
示例project 不与数据库交互,而是使用 json 存储。调试非常容易。试一试,事情会在某个时候变得更清楚。