我正在为我工作的公司创建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软件包?
答案 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...
}