我知道这个描述有点冗长,但很容易理解。我创建了一个自定义存储提供程序,它使用Dapper作为Entity Framework的替代品。为此,我创建了一个名为AspNet.Identity.Dapper的类库。 Web应用程序只是添加对此类库的引用以替换EF。
在类库中是这段代码:
在创建自定义提供程序时,我实现了自己的UserStore。 UserStore实现所有接口。这是定义:
public class UserStore<TUser> : IUserLoginStore<TUser,int>,
IUserClaimStore<TUser,int>,
IUserRoleStore<TUser,int>,
IUserPasswordStore<TUser,int>,
IUserSecurityStampStore<TUser,int>,
IQueryableUserStore<TUser,int>,
IUserEmailStore<TUser,int>,
IUserPhoneNumberStore<TUser,int>,
IUserTwoFactorStore<TUser, int>,
IUserLockoutStore<TUser, int>,
IUserStore<TUser,int>,
IDisposable
where TUser : IdentityMember
注意泛型类型的约束
where TUser : IdentityMember
UserStore将对UserTable的调用定义为:
public void Insert(TUser member)
{...}
通过身份代码进行调用,因此我无法更改定义。要自定义Web应用程序中用于添加额外自定义字段的类,只需要向继承自IdentiyUser类的AppMember类添加字段。以下代码段来自使用类库的Web应用程序。注意我只是将Profile字段添加到类中。
此代码来自使用Web的应用程序:
public class AppMember : IdentityMember
{
public Profile MemberProfile { get; set; }
}
AccountController内部Resger方法是这段代码:
await SignInManager.SignInAsync(AppMember, isPersistent: false, rememberBrowser: false);
这里我只是在AppMember发送到UserStore的路上之前填充Profile字段。
现在,这就是问题所在:
我无法在设计时访问AppMember的其他字段,因为它存在于自己的库中,并且不知道AppMember。 AppMember在消费网络应用程序中定义。
外部类库中的UserTable类内部是上面定义的Insert方法。请注意,它需要一个TUser成员参数。在运行时,这可以解决为每个应用程序类型AppMember。但是,在设计时,由于上面定义的约束,它会解析为IdentityMember。因此,我无法在设计时访问“配置文件”字段,因此我无法将它们保留到数据库中。如果我试试这个
member.Profile.fieldName
我收到编译错误,因为它不知道Profile。但是在运行时它在那里。我检查了调试器,运行时的类型是AppMember应该是。
我宁愿不将所有“额外字段”添加到Dapper库中的IdentityModel类,但此时我不知道其他任何方式。因此,我向更聪明,更有经验的开发人员展示这一点,希望我错过了一些东西,并且有办法实现这一目标。
任何帮助解决此事的人都将不胜感激!谢谢!