将Identity 2.0提取到域模型层

时间:2014-08-12 13:15:57

标签: c# asp.net-identity onion-architecture

我试图在我的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

什么是一个好的解决方案?

3 个答案:

答案 0 :(得分:2)

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

new UserManager<ApplicationUser>(new YourNameSpace.UserStore<YourApplicationUser>()))

答案 1 :(得分:2)

是的,这是Identity框架的一个大问题,我找不到好的解决方案。

我打算在我的域项目中添加EF,但是在一个项目中决定使用它:域模型不了解ApplicationUser,只使用Id来获取当前用户

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

在该项目中,我将所有身份代码保存在Web和数据项目中。

在我的其他项目中,我在整个地方添加了Identity和EF,包括Domain项目。你猜怎么着?没什么不好的。

我也看过像Imran Baloch博客已提供link的解决方案。对我来说,获得没有客户价值的工作看起来很多。

重复一遍,没有好的解决办法将EF与身份分开而不重写一堆代码(不喜欢它)。因此,要么将EF添加到您的域项目中(不喜欢它),要么将您的身份代码保存在Web /数据项目中(有时不可能,所以我也不喜欢它)。

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

答案 2 :(得分:0)

The problem is that you are trying to use the Onion pattern. In its foundations that you will always build dependencies.

Thrive for single responsibility of your models you are creating. You can do easily this by trying to follow Domain Driven Design properly by implementing individual models per layer:

  • BusinessLogic.Models.ApplicationUser
  • Presentiation.Models.ApplicationUser
  • DAL.Models.ApplicationUser

Note that all of those models are different classes even if they have 100% same properties (although it is never 100%). The drawback is that you may need to map from one model to another, but if you are trully aim for clean, modular and extensible architecture - that is the way. Hint you can use Automapper (or ExpressMapper) to avoid code needed for mapping.