繁体   English   中英

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

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

我正在尝试在我的ASP.NET核心MVC应用程序中播放UserRole,但它抛出了以下异常。

抛出异常:Microsoft.Extensions.DependencyInjection.dll中的'System.InvalidOperationException'Microsoft.Extensions.DependencyInjection.dll中出现类型'System.InvalidOperationException'的异常,但未在用户代码中处理无法解析类型'Microsoft的服务。 1[Microsoft.AspNetCore.Identity.IdentityRole]' while attempting to activate 'Microsoft.AspNetCore.Identity.AspNetRoleManager 1 [Microsoft.AspNetCore.Identity.IdentityRole]'时AspNetCore.Identity.IRoleStore 1[Microsoft.AspNetCore.Identity.IdentityRole]' while attempting to activate 'Microsoft.AspNetCore.Identity.AspNetRoleManager 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核心身份持久性,但是您还没有完全设置它。 IRoleStore等未默认注册,因为这是允许使用不同持久性机制的扩展点。 要在此处使用EF核心,您只需要添加对AddEntityFrameworkStores的调用,如下所示:

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

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

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

如果您没有为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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM