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进行存储。

10-08 02:22