使用Dapper的Asp.Net Identity 2.0自定义存储提供程序

时间:2014-09-02 21:19:21

标签: c# asp.net-identity asp.net-identity-2

我知道这个描述有点冗长,但很容易理解。我创建了一个自定义存储提供程序,它使用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类,但此时我不知道其他任何方式。因此,我向更聪明,更有经验的开发人员展示这一点,希望我错过了一些东西,并且有办法实现这一目标。

任何帮助解决此事的人都将不胜感激!谢谢!

0 个答案:

没有答案