【问题标题】:How to cast UserStore<IdentityUser> to its base class IUserStore<IUser>?如何将 UserStore<IdentityUser> 转换为其基类 IUserStore<IUser>?
【发布时间】:2013-11-12 12:21:51
【问题描述】:

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

那么,我该如何实现呢?

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

【问题讨论】:

  • IUser 是基类吗?你通常只会在界面上放一个 I。
  • 什么是 UserStore 和 IUserStore?试图谷歌,但它似乎不是一个标准的类?这是继承 List 还是什么?
  • 抱歉,如果您愿意,可以将其称为基本接口。一旦 UserStore 是 IUserStore 的实现,我可以通过以下方式获得演员表:UserStore as IUserStore;但我想避免 EntityFramework 引用和依赖中的 IdentityUser,以保持我的域层松散耦合。那么,IdentityUser 也是 IUser 的一个实现,你明白了吗?
  • 我试图写一些东西,但我有太多的如果、但是和可能。在我看来,您似乎试图做的事情并不适合泛型。
  • 你不能做这样的铸件或这样的事情是可能的:假设你有类class Dog : IAnamal {}class Cat : IAnamal {};并声明列表List&lt;Dog&gt; dogs = new List&lt;Dog&gt;();,如果我这样做IList&lt;IAnamal&gt; anamals = (IList&lt;IAnamal&gt;)dogs然后anamals.Add(new Cat()) 最后一个命令是完全合法的,因为anamals.Add 接受任何IAnamal,因为dogs[0] 现在包含Cat

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


【解决方案1】:

演员表不起作用,因为UserStore&lt;UserIdentity&gt;UserStore&lt;IUser&gt; 不同(即使IdentityUser 实现IUser)。

如果您需要UserStore&lt;IUser&gt;,那么我建议您以这种方式实现它并在内部强制转换为具体类型,您可以确保具体类型为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>();

【讨论】:

  • 是的,这是我的选择。实现 IUserStore 的接口,其中 T:来自核心的 IUser 和 IUser。但我试图这样做,使用微软的开箱即用实现,但它似乎强制与 IdentityUser 高度耦合,而不是仅使用 IUser
  • 当接口已经对T 有限制时,是否需要对具体类进行类型限制? (我真的不知道,我觉得我应该)
  • @ScottChamberlain 是的,接口并不隐含约束,但是,T 将针对它进行验证。
  • i3.asp.net/media/4459023/1.png 如果我们看这张图,我会看到我想要实现的目标。在我的域层中仅引用 Microsoft.AspNet.Identity.Core,但通过返回域层的核心接口在 DataAccess 层使用 Microsoft.AspNet.Identity.EntityFramework 实现。
  • Se,我不是在创建类,我只是想返回抽象的顶层,我知道这些概念,这应该有效: IUserStore userStore = new UserStore( );事实上,这是我的第一次尝试......但它没有奏效。尽管如此,Asp.Net 在内部使用了核心抽象,它在该图中是如何显示的。
猜你喜欢
  • 1970-01-01
  • 2015-05-13
  • 2015-02-08
  • 1970-01-01
  • 1970-01-01
  • 2012-12-06
  • 2017-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多