Можно ли использовать UserManager.AddToRoleAsyn c () без внедрения зависимостей? - PullRequest
0 голосов
/ 20 июня 2020

У меня есть работающее веб-приложение, в котором я пытаюсь улучшить фрагмент кода, отвечающий за импорт большого набора данных.

В этом конкретном случае мне нужно создать экземпляр a UserManager без внедрения зависимостей, чтобы использовать CreateAsyn c (), а затем AddToRoleAsyn c () .

Я сделал следующее:

IConfigurationRoot configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json")
                .AddJsonFile("appsettings.Development.json", optional: true)
                .AddJsonFile($"appsettings.{Environment.MachineName}.json", optional: true, reloadOnChange: true)
                .Build();

            var builder = new DbContextOptionsBuilder<ApplicationDbContext>();
            builder.UseSqlServer(configuration["ConnectionStrings:PsscDbConnection"], b => b.MigrationsAssembly("Devolabs.PSSC.Web"));
            IUserStore<ApplicationUser> _store = new Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<ApplicationUser>(new ApplicationDbContext(builder.Options));

            using (var userManager = new UserManager<ApplicationUser>(_store, null, new PasswordHasher<ApplicationUser>(), null, null, null, null, null, null))
            {
                ...
                var result = await userManager.CreateAsync(model, password);
                ...
                model = await userManager.FindByNameAsync(model.UserName);
                ...
                result = await userManager.AddToRolesAsync(model, roles.Distinct()); <==== Problem here
            }

Мой ApplicationDbContext выглядит следующим образом:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, string>
{
        ....
        
        public ApplicationDbContext(DbContextOptions options) : base(options)
        { }

        protected override void OnModelCreating(ModelBuilder builder)
        {
            base.OnModelCreating(builder);
        }
}

С ApplicationUser и с ApplicationRole, реализующими соответственно IdentityUser и IdentityRole.

Мои пользователи создают хорошо, что означает, что у userManager есть доступ в соответствующее хранилище пользователей с помощью DbContext.

=> Моя проблема связана с userManager.AddToRolesAsyn c (model, roles.Distinct ()). Я получаю исключение: Невозможно создать DbSet для IdentityRole, потому что этот тип не включен в модель для контекста

Я считаю, что мой ApplicationDbContext - это то, что предоставляет DbSet для IdentityUser и IdentityRole, но вроде этого мало.

Другая часть приложения использует DI и зависит от конфигурации Identity:

services.AddIdentity<ApplicationUser, ApplicationRole>()
                .AddEntityFrameworkStores<ApplicationDbContext>()
                .AddDefaultTokenProviders();

Но здесь я пытаюсь избежать DI, чтобы иметь возможность распоряжаться своим DbContext, когда я хочу.

Вы видите, что я делаю не так? Могу ли я сделать что-нибудь, чтобы установить конфигурацию удостоверения в другом месте, кроме конфигурации DI, и иметь возможность использовать роли с моим userManager?

...