将asp.net标识拆分为2个项目(网站和数据)

时间:2014-08-06 11:28:14

标签: c# asp.net asp.net-mvc asp.net-identity-2

我认为将网站(mvc)部分和数据部分分成2个不同的项目会很好。我还希望每个请求使用一个上下文(如果可能,请使用上下文)。

第一个真正的问题:我为什么要或不应该这样做。

第二个问题:我现在的方式出错了。我可以通过从NuGet安装实体框架包来解决它。但后来我有了这个想法,我仍然会混合东西。然后该网站知道它使用实体框架。

Error: The type 'Microsoft.AspNet.Identity.EntityFramework.IdentityDbContext`1<T0>' is defined in an assembly that is not referenced. You must add a reference to assembly 'Microsoft.AspNet.Identity.EntityFramework, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'.

代码:

public static Login.Data.ApplicationUserManager CreateApplicationUserManager(IdentityFactoryOptions<Login.Data.ApplicationUserManager> options, IOwinContext context)
{
  Login.Data.ApplicationUserManager manager = new Login.Data.ApplicationUserManager(context.Get<AppContext>());      
  return manager;
}

AppContext类:

public class AppContext : IdentityDbContext<ApplicationUser>, IDisposable
  {
    public AppContext()
      : base("MemberContext")
    {
    }

    public static AppContext CreateAppContext()
    {
      return new AppContext();
    }
  }

1 个答案:

答案 0 :(得分:1)

将asp.net Identity分成2个项目。第一个真正的问题:我为什么要或不应该这样做。

您绝对应该将Web应用程序与服务和数据库层分开(因此,如果您要拆分项目,则需要3个而不是2个)。但是你缺少服务层,它负责检索数据库实体并将其转换为业务/域对象,并将这些对象传递给Web应用程序(而不是数据库实体 - 需要EF)。

第二个问题:我现在的方式出错了。我可以通过从NuGet安装实体框架包来解决它。但后来我有了这个想法,我仍然会混合东西。然后该网站知道它使用实体框架。

如果您的Web应用程序直接访问数据上下文,那么它需要了解有关EF的实体框架和ASP.NET标识,因此您会收到错误。

创建一个服务层(一个新的类库),引用您的数据库项目并在该服务层中添加Entity Framework,然后使用该层从数据库中检索数据并将这些实体转换为业务对象。

将业务对象(而不是EF实体)传递给Web应用程序。然后在Web应用程序中,引用Services类库。

这将是一个良好的开端。