我正在尝试将新的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实现通过返回的核心接口域层。
答案 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>();