使用继承的Context时如何消除Microsoft.AspNet.Identity.EntityFramework依赖关系?

时间:2019-06-19 00:11:11

标签: c# entity-framework asp.net-identity

我正在为我工​​作的公司创建ASP.NET MVC 5项目的基础C#库,因此当我们必须共享源代码时,我们将包括对Enterprise.Classes库的引用,并且不需要原始依赖项因为此类将集成所有功能。

对于DbContext,我们创建了一个自IdentityDbContext继承的自定义上下文,但是只要继承了它来创建新的上下文,就需要安装Microsoft.AspNet.Identity.EntityFramework Nuget软件包工作。

到目前为止,这是自定义DbContext的代码:

[DbConfigurationType(typeof(EnterpriseDbConfiguration))]
public class EnterpriseDbContext : IdentityDbContext<EnterpriseUser, EnterpriseRole, long, EnterpriseUserLogin,
    EnterpriseUserRole, EnterpriseUserClaim>
{
    public EnterpriseDbContext(string contextName = "DefaultEnterpriseConnection") : base(contextName)
    {
        /* Entities, Configurations and stuff */
    }
}

这是EnterpriseUser类(将是IdentityUser类)的示例:

public class EnterpriseUser : IdentityUser<long, EnterpriseUserLogin, EnterpriseUserRole, EnterpriseUserClaim>
{
    public EnterpriseUser()
    {
        RegistrationDate = DateTime.Now;
        Enabled = true;
    }

    /* Additional Properties */
}

这里是一个继承上下文的示例,当将EnterpriseDbContext标记为继承时,它需要安装Microsoft.AspNet.Identity.EntityFramework Nuget软件包:

public class InheritedEnterpriseContext : EnterpriseInfrastructure.Data.EnterpriseDbContext
{

}

如何构建EnterpriseDbContext,以使其在继承时不需要安装Nuget软件包?

Captura Visual Studio

1 个答案:

答案 0 :(得分:0)

问题将是,通过公开一个直接继承的类,该类的使用者将需要了解所有公共共享成员,从而需要依赖于AspNet.Identity.EntityFramework库,无论您是否打算使用它们。

编辑:对IdentityDbContext的更正及其目的...

IdentityDbContext用于ASP.Net的身份验证/授权,因此您的选择是扩展IdentityDbContext,在这种情况下,您将需要在引用DbContext的任何地方引用ASPNet.Identity.EntityFramework,或者对标识和应用程序信息使用单独的上下文

您可以定义您的EnterpriseUser / Role类并构造一个IdentityDbContext实例,以提供给UserStore等进行Auth。然后定义您的EnterpriseDbContext以扩展DbContext。您也可以根据需要为EnterpriseUser / Role定义DbSet。此DbContext可以被其他代码共享/引用。您要使用IdentityDbContext的任何MVC项目显然都需要ASPNet.Identity.EntityFramework。其他库将仅使用普通EF参考来使用EnterpriseDbContext / w。

public class EnterpriseDbContext : DbContext
{
    public DbSet<EnterpriseUser> EnterpriseUsers { get; set; }
    // .. Your data entities.
}

如果EnterpriseUser扩展了IdentityUser,则您可能仍将依赖于.Identity.EntityFramework。在这种情况下,您应该为EnterpriseDbContext定义一个替代的“ User”实体,该实体替代EnterpriseUser并将其用于应用程序DbContext。

// Can't use this in our EnterpriseDbContext because IdentityUser will require ref. to .Identity.EntityFramework
public class EnterpriseUser : IdentityUser<Guid>
{
   // Stuff.
}

// Use this instead in our EnterpriseDbContext to map to the same table
[Table("EnterpriseUsers")]
public class User
{
   public Guid Id { get; set; }
   public string UserName { get; set; }
   // Stuff...
}