Не удалось разрешить службу для типа 'Microsoft.AspNetCore.Identity.IRoleStore - PullRequest
0 голосов
/ 25 ноября 2018

Я пытаюсь заполнить UserRole в своем приложении ASP.NET Core MVC, но оно выдает следующее исключение.

Исключение: «System.InvalidOperationException» в Microsoft.Extensions.DependencyInjection.dll Исключение типа «System.InvalidOperationException» произошло в Microsoft.Extensions.DependencyInjection.dll, но не было обработано в коде пользователя. Не удалось разрешить службу для типа «Microsoft.AspNetCore.Identity.IRoleStore 1[Microsoft.AspNetCore.Identity.IdentityRole]' while attempting to activate 'Microsoft.AspNetCore.Identity.AspNetRoleManager 1 [Microsoft.AspNetCore.Identity.IdentityRole] '.

Добавить службу

services.AddDbContext<AppDbContext>(option =>
               option.UseSqlServer(
               Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<AppUser, IdentityRole>(options => { }); 

Семя

private void CreateRoles(IServiceProvider serviceProvider)
{
    var roleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
    var userManager = serviceProvider.GetRequiredService<UserManager<SchoolUser>>();
        .................
        .................
}

Я звоню CreateRoles() внутри Configure() при запуске.cs и выбрасывает вышеуказанное исключение в первую строку CreateRoles().Исключение говорит, что это проблема DependencyInjection, как я могу решить эту проблему?

Ответы [ 3 ]

0 голосов
/ 26 ноября 2018

Я думаю, вы получите эту ошибку, если не создадите область для своего DI.

Предполагается, что вы начнете в своем Program.cs

var host = CreateWebHostBuilder(args).Build();

try
{
    var scope = host.Services.CreateScope(); <-- Need this

    var roleMgr = scope.ServiceProvider.GetRequiredService<RoleManager<IdentityRole>>();
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
}

host.Run();
0 голосов
/ 08 января 2019

Согласно документу MSDN, наиболее эффективным способом является

    services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(
        Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<IdentityUser>().AddRoles<IdentityRole>() <--Here!!!
     .AddEntityFrameworkStores<ApplicationDbContext>();
0 голосов
/ 25 ноября 2018

Похоже, вы намереваетесь использовать Entity Framework Core для своей персистентности ASP.NET Core Identity, но вы еще не совсем настроили это.IRoleStore и другие не зарегистрированы по умолчанию, так как это точка расширения, позволяющая использовать различные механизмы сохранения.Чтобы использовать EF core здесь, вам просто нужно добавить вызов к AddEntityFrameworkStores, вот так:

services.AddIdentity<AppUser, IdentityRole>()
    .AddEntityFrameworkStores<AppDbContext>();
...