Asp.net Identity Framework中提供的所有I*Store<TUser>
接口都继承自IUserStore<TUser>
。这迫使每个接口的实现实现与用户相关的方法,或者让单个类全部继承它们。
IUserClaimStore<TUser>
IUserPasswordStore<TUser>
IUserLoginStore<TUser>
IUserSecurityStampStore<TUser>
如果我需要为登录或密码、声明或安全戳提供不同的存储,比如说Xml存储而不是EF或任何DB,我也需要实现与用户相关的方法(User: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方法(毕竟,如果你不能将Find
或Update
作为一个条目,那么像IUserPasswordStore<TUser>
这样的方法有什么用?),所以它们都实现了IUserStore
。
您可以实现这些接口并控制帐户数据的存储方式。您可以自定义用户帐户数据,例如,如果您想要与用户关联的更多数据,则可以将其添加到实现IUser
的自定义用户类中,并且可以通过实现IUserStore
来存储额外的数据。