Как устранить зависимость Microsoft.AspNet.Identity.EntityFramework при использовании унаследованного контекста? - PullRequest
1 голос
/ 19 июня 2019

Я создаю базовую библиотеку C # для проектов ASP.NET MVC 5 для компании, в которой я работаю, поэтому, когда мы должны делиться исходным кодом, мы включаем ссылки на библиотеку 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 голосов
/ 19 июня 2019

Проблема будет заключаться в том, что, предоставляя класс, который непосредственно наследует, потребители этого класса должны будут знать обо всех общедоступных общих членах, что требует зависимости от библиотеки AspNet.Identity.EntityFramework, независимо от того, собираетесь ли вы их использовать или нет.

Редактировать: Исправления вокруг IdentityDbContext и его назначение ...

IdentityDbContext используется для аутентификации / авторизации ASP.Net, поэтому вы можете либо расширить IdentityDbContext, и в этом случае вам нужно будет ссылаться на ASPNet.Identity.EntityFramework везде, где есть ссылки на ваш DbContext, либо использовать отдельные контексты для вашей идентификации и информации о приложении. .

Вы можете определить свои классы EnterpriseUser / Role и создать экземпляр IdentityDbContext, чтобы предоставить его в UserStore и т. Д. Для Auth. Затем определите ваш EnterpriseDbContext для расширения DbContext. Он также может определять DbSets для EnterpriseUser / Role, как вам удобно. Этот DbContext может использоваться совместно с другим кодом. Любой проект MVC, который вы хотите использовать IdentityDbContext, очевидно, нуждается в ASPNet.Identity.EntityFramework. Другие библиотеки будут использовать ваш EnterpriseDbContext / w как обычную ссылку EF.

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

Если EnterpriseUser расширяет IdentityUser, вы, вероятно, все еще будете зависеть от .Identity.EntityFramework. В этом случае вы должны определить альтернативную сущность «Пользователь» для вашего EnterpriseDbContext, которая является прокси для 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...
}
...