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

时间:2018-11-25 18:32:38

标签: c# asp.net-core dependency-injection asp.net-identity

我正在尝试在ASP.NET Core MVC App中播种UserRole,但是它引发以下异常。

  

引发的异常:Microsoft.Extensions.DependencyInjection.dll中的“ System.InvalidOperationException”   Microsoft.Extensions.DependencyInjection.dll中发生类型'System.InvalidOperationException'的异常,但未在用户代码中处理   无法解析类型为“ 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>>();
        .................
        .................
}

我在Startup.cs的CreateRoles()内叫Configure() 并在CreateRoles()的第一行引发上述异常。 异常是DependencyInjection问题,我该如何解决?

3 个答案:

答案 0 :(得分:2)

您似乎打算将Entity Framework Core用于ASP.NET Core Identity持久性,但是您尚未对此进行设置。 IRoleStore等人默认情况下未注册,因为这是允许使用不同持久机制的扩展点。为了在这里使用EF核心,您只需要向AddEntityFrameworkStores添加一个调用,就像这样:

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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