1

我正在尝试将新的 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>

那么,我该如何实现呢?

如果我们看一下这张 http://i3.asp.net/media/4459023/1.png,我们会看到我想要实现的目标。在我的域层中仅引用 Microsoft.AspNet.Identity.Core,但通过返回域层的核心接口在 DataAccess 层使用 Microsoft.AspNet.Identity.EntityFramework 实现。

4

1 回答 1

0

演员表不起作用,因为UserStore<UserIdentity>UserStore<IUser>(即使IdentityUserimplements 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>();
于 2013-11-12T14:56:35.777 回答