我知道这个描述有点长,但很容易理解。我创建了一个自定义存储提供程序,它使用 Dapper 作为实体框架的替代品。为此,我创建了一个名为 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 在消费 Web 应用程序中定义。
外部类库中的 UserTable 类内部是上面定义的 Insert 方法。请注意,它需要一个 TUser 成员参数。在运行时,它会解析为上面的 AppMember 类型,因为它应该是这样。但是,在设计时,由于上面定义的约束,它解析为 IdentityMember。因此,我无法在设计时访问 Profile 字段,因此无法将它们保存到数据库中。如果我尝试这个
member.Profile.fieldName
我收到编译错误,因为它不了解 Profile。然而在运行时它就在那里。我用调试器检查过,运行时的类型应该是 AppMember。
我不想将所有“额外字段”添加到 Dapper 库中的 IdentityModel 类中,但目前我不知道有任何其他方法。因此,我将其呈现给比我更聪明、更有经验的开发人员,希望我遗漏了一些东西,并且有一种方法可以实现这一点。
任何解决此问题的帮助将不胜感激!谢谢你!