如何将UserStore <identityuser>强制转换为其基类IUserStore <iuser>?</iuser> </identityuser>

时间:2013-11-12 12:21:52

标签: asp.net asp.net-mvc entity-framework identity claims-based-identity

我正在尝试将新的asp.net身份提供程序与我的模型域的抽象层一起使用,它具有实体框架的实现,所以我想在我的实体框架中使用开箱即用版本的身份数据访问层。

如何转换

UserStore<IdentityUser> 

到它的基本界面

IUserStore<IUser>

一旦UserStore是IUserStore的一个实现,我可以通过这个获得演员:

UserStore<IdentityUser> as IUserStore<IdentityUser>

但我想避免EntityFramework引用和依赖中的IdentityUser,以保持我的域层松散耦合。因此,IdentityUser也是IUser的一个实现,我可以投射它:

IdentityUser as IUser

这两种情况都有效,那么我想做一些这样的事情(事实上它并不能直接起作用):

UserStore<IdentityUser> as IUserStore<IUser>

那么,我怎样才能做到这一点?

如果我们查看此diagram http://i3.asp.net/media/4459023/1.png,我们会看到我想要实现的目标。引用只是在我的领域层的Microsoft.AspNet.Identity.Core,但使用的数据访问层Microsoft.AspNet.Identity.EntityFramework实现通过返回的核心接口域层。

1 个答案:

答案 0 :(得分:0)

投射不起作用,因为UserStore<UserIdentity>UserStore<IUser>不同(即使IdentityUser实施IUser)。

如果您需要UserStore<IUser>,我建议您以这种方式实现它并在内部强制转换为具体类型,您可以确保具体约束为IdentityUser的具体类型。

public class UserStore<T> : IUserStore<T> where T: IUser
{
}

您还需要使您的界面协变,即

public interface IUserStore<out T> where T : IUser
{
}

这应该允许您执行以下操作(假设IdentityUser支持IUser

IUserStore<IUser> userStore = new UserStore<IdentityUser>();