14

我正在尝试在遵循洋葱架构的 ASP.NET MVC 5 解决方案中实现 Identity 2.0。

我有一个ApplicationUser在我的核心。

namespace Core.DomainModel
{
    public class ApplicationUser {...}
}

在我的数据访问层中,我使用的是 Entity Framework 6.1,而我的上下文来源于IdentityDbContext问题所在。ApplicationUser需要从Microsoft.AspNet.Identity.EntityFramework.IdentityUser

namespace Infrastructure.DAL
{
    public class TestContext : IdentityDbContext<ApplicationUser> {...}
}

我的域模型不应该引用Microsoft.AspNet.Identity.EntityFramework会违背洋葱的想法。

什么是好的解决方案?

4

3 回答 3

3

是的,这是身份框架的大问题,我还没有找到好的解决方案。

我打算将 EF 添加到我的域项目中,但在一个项目中决定反对它:域模型不知道ApplicationUser,仅Id用于他们从中获得的当前用户

ClaimsPrincipal.Current.Claims
    .FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier)
    .Value

在那个项目中,我将所有身份代码保留在 Web 和数据项目中。

在我的另一个项目中,我在所有地方都添加了 Identity 和 EF,包括域项目。你猜怎么着?没有什么不好的事情发生。

我还查看了一些解决方案,例如已经提供的 Imran Baloch 博客链接。对我来说,没有获得任何客户价值似乎需要做很多工作。

再说一遍,没有好的解决方案可以在不重写一堆代码的情况下将 EF 与 Identity 分开(不喜欢它)。因此,要么将 EF 添加到您的域项目(不喜欢它),要么将您的身份代码保留在 Web/Data 项目中(有时不可能,所以我也不喜欢它)。

很抱歉,这是 .Net 的低级限制。

于 2014-08-16T23:34:36.577 回答
2

您可以从 Core 命名空间继承 IUser 并且用户管理器会很高兴。您需要将 IUserStore 替换为您自己的实现。然后初始化用户管理器,例如:

new UserManager<ApplicationUser>(new YourNameSpace.UserStore<YourApplicationUser>()))
于 2014-08-12T15:11:12.037 回答
1

问题是您正在尝试使用洋葱模式。在它的基础上,您将始终构建依赖关系。

为您正在创建的模型的单一责任而茁壮成长。您可以通过在每层实施单独的模型来尝试正确遵循领域驱动设计来轻松做到这一点:

  • BusinessLogic.Models.ApplicationUser
  • Presentation.Models.ApplicationUser
  • DAL.Models.ApplicationUser

请注意,所有这些模型都是不同的类,即使它们具有 100% 相同的属性(尽管它永远不是 100%)。缺点是您可能需要从一个模型映射到另一个模型,但如果您真正的目标是干净、模块化和可扩展的架构 - 这就是方式。提示您可以使用Automapper(或ExpressMapper)来避免映射所需的代码。

于 2015-07-28T16:07:34.080 回答