Asp.net Identity Framework中提供的所有I*Store<TUser>
接口都从IUserStore<TUser>
继承。这迫使每个接口的实现都实现与用户相关的方法,或者让单个类继承所有这些方法。IUserClaimStore<TUser>
IUserPasswordStore<TUser>
IUserLoginStore<TUser>
IUserSecurityStampStore<TUser>
如果我需要为登录名或密码,声明或安全性戳提供不同的存储(例如Xml存储而不是EF或任何数据库),我也需要实现与用户相关的方法(用户:CreateAsync,UpdateAsync,DeleteAsync,FindByIdAsync,FindByNameAsync)。
那么,提供这种架构的背后的策略是什么?
最佳答案
IUserStore<>
定义CRUD操作:
public interface IUser
{
string Id { get; }
string UserName { get; set; }
}
public interface IUserStore<TUser> : IDisposable where TUser : IUser
{
Task CreateAsync(TUser user);
Task DeleteAsync(TUser user);
Task<TUser> FindByIdAsync(string userId);
Task<TUser> FindByNameAsync(string userName);
Task UpdateAsync(TUser user);
}
由于每个
I*Store<TUser>
必须提供完整的CRUD方法集(毕竟,如果您不能IUserPasswordStore<TUser>
或Find
一个条目,那么Update
的用途是什么?),因此它们各自实现IUserStore
。您可以实现这些接口并控制帐户数据的存储方式。您可以自定义用户帐户数据,例如如果要与用户相关联的更多数据,则可以将其添加到实现
IUser
的自定义用户类中,多余的数据可以通过实现IUserStore
进行存储。