有几种策略可以将额外的元数据附加到UserAuth和UserAuthDetails表中,
如果您想用您自己的自定义 POCO 扩展UserAuth的模式,您需要对OrmLiteAuthRepository<T,T>
包括您的自定义 POCO 的类进行子类化,例如查看OrmLiteAuthRepository的源代码:
public class OrmLiteAuthRepository
: OrmLiteAuthRepository<UserAuth, UserAuthDetails>, IUserAuthRepository
{
public OrmLiteAuthRepository(IDbConnectionFactory dbFactory)
: base(dbFactory) { }
}
使用您自己键入的自定义会话扩展 UserAuthSession
同时扩展和提供一个类型化的、自定义的AuthUserSession是推荐的方法,因为它受到ServiceStack 的 身份验证功能的支持,因为用户会话只是在缓存提供程序(即不在 RDBMS 中)中,它的无模式持久性特征很容易支持扩展类型。
向元字典字段添加额外的元数据
对于次要扩展,您可以使用每个表上的元字符串字典字段,这些字段是专门为支持自定义元数据而添加的。它们还包括有用的Get<T>
和Set<T>
方法,这些方法也支持 blobbing 复杂类型:
userAuth.Set(new Address { ... });
var address = userAuth.Get<Address>();
将参考数据与 RefId 和 RefIdStr 字段链接
UserAuth
和UserAuthDetails
表还包括一个int? RefId
和一个字段,您可以使用这些string RefIdStr
字段来引用外部数据,例如针对每个用户身份验证记录或用户 OAuth 注册的自定义表。
将 UserAuth 信息提取到您自己的自定义表中
另一种选择是执行SocialBootstrapApi 示例演示正在做的事情,并通过覆盖您自己的自定义 UserSession 中的OnAuthenticated钩子将 UserAuth 信息提取到您自己的自定义表中,每次用户成功进行身份验证时都会调用该钩子。
这是将会话数据复制到自定义用户 POCO 并将其保存在不同表中的SocialBootstrapApi 示例。
public class CustomUserSession : AuthUserSession
{
public string CustomId { get; set; }
public override void OnAuthenticated(IServiceBase authService, IAuthSession session,
IAuthTokens tokens, Dictionary<string, string> authInfo)
{
base.OnAuthenticated(authService, session, tokens, authInfo);
//Populate all matching fields from this session to your own custom User table
var user = session.TranslateTo<User>();
user.Id = int.Parse(session.UserAuthId);
user.GravatarImageUrl64 = !session.Email.IsNullOrEmpty()
? CreateGravatarUrl(session.Email, 64)
: null;
//Resolve the DbFactory from the IOC and persist the user info
using (var db = authService.TryResolve<IDbConnectionFactory>().Open())
{
db.Save(user);
}
}
}