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

C# 将asp.net标识拆分为2个项目(网站和数据),c#,asp.net,asp.net-mvc,asp.net-identity-2,C#,Asp.net,Asp.net Mvc,Asp.net Identity 2,我的想法是最好将网站(mvc)部分和数据部分分成两个不同的项目。我还希望为每个请求使用上下文(如果可能,在上下文中使用owin) 第一个真正的问题:我为什么应该或者不应该这样做 第二个问题:我现在的做法是错误的。我可以通过安装NuGet的entity framework包来解决这个问题。但我有一个想法,我仍然会混合东西。然后网站知道它使用实体框架 Error: The type 'Microsoft.AspNet.Identity.EntityFramework.IdentityDbContex

我的想法是最好将网站(mvc)部分和数据部分分成两个不同的项目。我还希望为每个请求使用上下文(如果可能,在上下文中使用owin)

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

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

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'.
错误:在未引用的程序集中定义了类型“Microsoft.AspNet.Identity.EntityFramework.IdentityDbContext`1”。您必须添加对程序集“Microsoft.AspNet.Identity.EntityFramework,版本=2.0.0.0,区域性=中性,PublicKeyToken=31bf3856ad364e35”的引用。
守则:

public static Login.Data.ApplicationUserManager创建ApplicationUserManager(IdentityFactoryOptions选项,IOwinContext上下文)
{
Login.Data.ApplicationUserManager=new Login.Data.ApplicationUserManager(context.Get());
退货经理;
}
以及AppContext类:

public类AppContext:IdentityDbContext,IDisposable
{
公共AppContext()
:base(“MemberContext”)
{
}
公共静态AppContext CreateAppContext()
{
返回新的AppContext();
}
}

将asp.net标识拆分为两个项目。第一个真正的问题:我为什么应该或不应该这样做。

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

还有第二个问题:我现在犯的错误。我可能可以通过安装NuGet的entity framework包来解决这个问题。但我有一个想法,我仍然会混合东西。然后网站知道它使用实体框架。

如果您的web应用程序直接访问数据上下文,那么它需要了解实体框架和ASP.NET Identity for EF,因此会出现错误

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

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


这将是一个很好的开始。

@DavidG:看着这个错误,我觉得有点奇怪。您能再解释一下为什么在数据项目中添加对Identity的引用应该有效吗?
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;
}
public class AppContext : IdentityDbContext<ApplicationUser>, IDisposable
  {
    public AppContext()
      : base("MemberContext")
    {
    }

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