无法解析类型 'Microsoft.AspNetCore.Identity.IRoleStore 的服务

Unable to resolve service for type 'Microsoft.AspNetCore.Identity.IRoleStore

我试图在我的 ASP.NET 核心 MVC 应用程序中植入 UserRole,但它抛出了以下异常。

Exception thrown: 'System.InvalidOperationException' in Microsoft.Extensions.DependencyInjection.dll An exception of type 'System.InvalidOperationException' occurred in Microsoft.Extensions.DependencyInjection.dll but was not handled in user code Unable to resolve service for type 'Microsoft.AspNetCore.Identity.IRoleStore1[Microsoft.AspNetCore.Identity.IdentityRole]' while attempting to activate 'Microsoft.AspNetCore.Identity.AspNetRoleManager1[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>>();
        .................
        .................
}

我正在调用 Startup.cs 的 Configure() 中的 CreateRoles() 并在 CreateRoles() 的第一行抛出上述异常。 异常说是DependencyInjection问题,请问如何解决?

您似乎打算使用 Entity Framework Core 来实现 ASP.NET Core Identity 持久性,但您还没有完全设置它。 IRoleStore 等默认情况下未注册,因为这是允许使用不同持久性机制的扩展点。为了在这里使用 EF 核心,您只需要添加对 AddEntityFrameworkStores 的调用,如下所示:

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

我认为如果不为 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();

根据MSDN文档,最有效的方法是

    services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(
        Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<IdentityUser>().AddRoles<IdentityRole>() <--Here!!!
     .AddEntityFrameworkStores<ApplicationDbContext>();