ASP.NET Core 3:无法从根提供程序解析范围服务“Microsoft.AspNetCore.Identity.UserManager`1[Alpha.Models.Identity.User]”

Jah*_*han 2 c# entity-framework-core asp.net-core asp.net-core-identity asp.net-core-3.0

运行项目时,遇到这个问题:(我用过asp.net core 3。)

无法从根提供程序解析范围服务“Microsoft.AspNetCore.Identity.UserManager`1[Alpha.Models.Identity.User]”。

我怎么解决这个问题?

ApplicationDbContext 类:

public class ApplicationDbContext : IdentityDbContext<User, Role, int, 
UserClaim, UserRole, UserLogin, RoleClaim, UserToken>
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
    {

    }
public static async Task CreateAdminAccount(IServiceProvider 
serviceProvider, IConfiguration configuration)
    {
        UserManager<User> userManager = 
serviceProvider.GetRequiredService<UserManager<User>>();
        RoleManager<Role> roleManager = 
serviceProvider.GetRequiredService<RoleManager<Role>>();

        string userName = configuration["Data:AdminUser:Name"];
        string email = configuration["Data:AdminUser:Email"];
        string password = configuration["Data:AdminUser:Password"];
        string role = configuration["Data:AdminUser:Role"];

        if (await userManager.FindByNameAsync(userName) == null)
        {
            if (await roleManager.FindByNameAsync(role) == null)
            {
                await roleManager.CreateAsync(new Role(role));
            }

            User user = new User
            {
                Email = email,
                UserName = userName
            };
            var result = userManager.CreateAsync(user, password);
            if (result.IsCompletedSuccessfully)
            {
                await userManager.AddToRoleAsync(user, role);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

错误详情:

启动应用程序时发生错误。AggregateException:发生一个或多个错误。(无法从根提供程序解析范围服务 'Microsoft.AspNetCore.Identity.UserManager`1[Alpha.Models.Identity.User]'。) System.Threading.Tasks.Task.ThrowIfExceptional(bool includeTaskCanceledExceptions)

InvalidOperationException:无法从根提供程序解析范围服务“Microsoft.AspNetCore.Identity.UserManager`1[Alpha.Models.Identity.User]”。Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(Type serviceType, IServiceScope scope, IServiceScope rootScope)

AggregateException:发生一个或多个错误。(无法从根提供程序解析范围服务 'Microsoft.AspNetCore.Identity.UserManager`1[Alpha.Models.Identity.User]'。) System.Threading.Tasks.Task.ThrowIfExceptional(bool includeTaskCanceledExceptions) System.Threading.Tasks.Task .Wait(int millisecondsTimeout, CancellationToken cancelationToken) System.Threading.Tasks.Task.Wait() Alpha.Web.App.Startup.Configure(IApplicationBuilder app, IWebHostEnvironment env) 在 Startup.cs + ApplicationDbContext.CreateAdminAccount(app.ApplicationServices, Configuration) )。等待(); System.RuntimeMethodHandle.InvokeMethod(object target, object[] arguments, Signature sig, bool constructor, bool wrapExceptions) System.Reflection.RuntimeMethodInfo.Invoke(object obj, BindingFlags invokeAttr, Binder binder,

显示原始异常详细信息 InvalidOperationException:无法从根提供程序解析范围服务“Microsoft.AspNetCore.Identity.UserManager`1[Alpha.Models.Identity.User]”。Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(Type serviceType, IServiceScope scope, IServiceScope rootScope) Microsoft.Extensions.DependencyInjection.ServiceProvider.Microsoft.Extensions.DependencyInjection.ServiceLookup.IServiceProviderEngineCallback.OnResolve(Type serviceScope),. .DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope) Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType) Microsoft.Extensions。

显示原始异常详细信息 System.InvalidOperationException:无法从根提供程序解析范围服务“Microsoft.AspNetCore.Identity.UserManager`1[Alpha.Models.Identity.User]”。在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(Type serviceType, IServiceScope scope, IServiceScope rootScope) at Microsoft.Extensions.DependencyInjection.ServiceProvider.Microsoft.Extensions.DependencyInjection.ServiceLookup.IServiceProviderEngineCallback.OnResolve, IServiceScope rootScope) Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope)
在 Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType) at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType) at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredServiceProvider[T](T)在 Alpha.DataAccess.ApplicationDbContext.CreateAdminAccount(IServiceProvider serviceProvider, IConfiguration configuration) 在 E:\Archives\Projects\Alpha\Alpha.DataAccess\ApplicationDbContext.cs:line 92 .NET Core 3.0.0 X64 v4.0.0.0 | Microsoft.AspNetCore.Hosting 版本 3.0.0-rc2.19465.2 | 微软视窗 10.0.17763 |
需要帮忙?

错误详情

Kir*_*kin 13

从您包含的屏幕截图中,它显示您在 中有以下行Startup.Configure

ApplicationDbContext.CreateAdminAccount(app.ApplicationServices, Configuration)
    .Wait();
Run Code Online (Sandbox Code Playgroud)

IServiceProvider存储在其中的实例IApplicationBuilder.ApplicationServices是您的应用程序的服务提供者。该错误消息指出它无法解析来自服务提供者的范围服务。

这个问题经常出现,但对于您的场景最简单的解决方案是注入IServiceProvider您的Configure方法并将其传递给CreateAdminAccount

public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider)
{
    ApplicationDbContext.CreateAdminAccount(serviceProvider, Configuration)
        .Wait();
}
Run Code Online (Sandbox Code Playgroud)

IServiceProvider传入的实例Configurescoped,这意味着您可以使用它来创建作用域服务。

这就是完成这项工作所需的全部内容,但在Program. 这使播种问题与配置管道分开,并且还允许使用async/ await。下面是一个例子:

public class Program
{
    public static async Task Main(string[] args)
    {
        var host = CreateHostBuilder(args).Build();

        using (var scope = host.Services.CreateScope())
        {
            var serviceProvider = scope.ServiceProvider;
            var config = serviceProvider.GetRequiredService<IConfiguration>();

            await ApplicationDbContext.CreateAdminAccount(serviceProvider, config);
        }

        await host.RunAsync();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        // ...
}
Run Code Online (Sandbox Code Playgroud)

您也可以解析UserManager<User>RoleManager<Role>输入Main,并将它们传递给CreateAdminAccount而不是使用服务定位器方法。