ASP.NET Core 3:无法从根提供程序解析作用域服务'Microsoft.AspNetCore.Identity.UserManager`1 [Alpha.Models.Identity.User]'

问题描述 投票:0回答:1

当我运行项目时,遇到此问题:(我用过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);
            }
        }
    }
}

错误的详细信息:

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

InvalidOperationException:无法解析作用域服务'Microsoft.AspNetCore.Identity.UserManager`1 [Alpha.Models.Identity.User]'来自根提供商。Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(TypeserviceType,IServiceScope范围,IServiceScope rootScope)

AggregateException:发生一个或多个错误。 (无法解决范围服务'Microsoft.AspNetCore.Identity.UserManager`1 [Alpha.Models.Identity.User]'来自根提供商。)System.Threading.Tasks.Task.ThrowIfExceptional(布尔includeTaskCanceledExceptions)System.Threading.Tasks.Task.Wait(int毫秒超时,CancelationToken取消(Token)System.Threading.Tasks.Task.Wait()Alpha.Web.App.Startup.Configure(IApplicationBuilder应用,Startup.cs中的IWebHostEnvironment env)+ApplicationDbContext.CreateAdminAccount(app.ApplicationServices,配置).Wait(); System.RuntimeMethodHandle.InvokeMethod(对象目标,对象[]参数,签名sig,布尔构造函数,布尔wrapExceptions)System.Reflection.RuntimeMethodInfo.Invoke(对象obj,BindingFlags invokeAttr,活页夹活页夹,object []参数,CultureInfo文化)Microsoft.AspNetCore.Hosting.ConfigureBuilder.Invoke(对象实例,IApplicationBuilder构建器)Microsoft.AspNetCore.Hosting.ConfigureBuilder + <> c__DisplayClass4_0.b__0(IApplicationBuilder建造者)Microsoft.AspNetCore.Hosting.GenericWebHostBuilder + <> c__DisplayClass13_0.b__2(IApplicationBuilder应用程式)Microsoft.AspNetCore.Mvc.Filters.MiddlewareFilterBuilderStartupFilter + <> c__DisplayClass0_0.g__MiddlewareFilterBuilder | 0(IApplicationBuilder建造者)Microsoft.AspNetCore.Server.IIS.Core.IISServerSetupFilter + <> c__DisplayClass2_0.b__0(IApplicationBuilder应用程式)Microsoft.AspNetCore.HostFilteringStartupFilter + <> c__DisplayClass0_0.b__0(IApplicationBuilder应用程式)Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationTokencancelToken)Microsoft.Extensions.Hosting.Internal.Host.StartAsync(CancellationTokencancelToken)Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost主机,CancellationToken令牌)Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost主机,CancellationToken令牌)Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.Run(IHost主机)Program.cs中的Alpha.Web.App.Program.Main(string [] args)+CreateHostBuilder(args).Build()。Run();

显示原始异常详细信息InvalidOperationException:无法解决范围服务'Microsoft.AspNetCore.Identity.UserManager`1 [Alpha.Models.Identity.User]'来自根提供商。Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(TypeserviceType,IServiceScope范围,IServiceScope rootScope)Microsoft.Extensions.DependencyInjection.ServiceProvider.Microsoft.Extensions.DependencyInjection.ServiceLookup.IServiceProviderEngineCallback.OnResolve(TypeserviceType,IServiceScope范围)Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(TypeserviceType,ServiceProviderEngineScope(serviceProviderEngineScope)Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type服务类型)Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider提供者,输入serviceType)Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider提供者)Alpha.DataAccess.ApplicationDbContext.CreateAdminAccount(IServiceProviderserviceProvider,IConfiguration配置)中ApplicationDbContext.cs+UserManager userManager = serviceProvider.GetRequiredService>();

显示原始异常详细信息System.InvalidOperationException:无法解决范围服务'Microsoft.AspNetCore.Identity.UserManager`1 [Alpha.Models.Identity.User]'来自根提供商。在Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(TypeserviceType,IServiceScope范围,IServiceScope rootScope)位于Microsoft.Extensions.DependencyInjection.ServiceProvider.Microsoft.Extensions.DependencyInjection.ServiceLookup.IServiceProviderEngineCallback.OnResolve(TypeserviceType,IServiceScope范围)Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(TypeserviceType,ServiceProviderEngineScope(serviceProviderEngineScope)在Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(TypeserviceType)在Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider提供者,输入serviceType)Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService [T](IServiceProvider供应商)Alpha.DataAccess.ApplicationDbContext.CreateAdminAccount(IServiceProviderserviceProvider,IConfiguration配置)中E:\ Archives \ Projects \ Alpha \ Alpha.DataAccess \ ApplicationDbContext.cs:line92 .NET Core 3.0.0 X64 v4.0.0.0 | Microsoft.AspNetCore.Hosting版本3.0.0-rc2.19465.2 | Microsoft Windows 10.0.17763 |需要帮助吗?

error details

c# asp.net-core entity-framework-core asp.net-core-identity asp.net-core-3.0
1个回答
3
投票

从您随附的屏幕快照中,它表明您在Startup.Configure中包含以下行:

ApplicationDbContext.CreateAdminAccount(app.ApplicationServices, Configuration)
    .Wait();

存储在IServiceProvider中的IApplicationBuilder.ApplicationServices实例是您的应用程序的root服务提供者。错误消息指出,它无法解析root服务提供者的scoped服务。

此问题经常出现,但是针对您的情况最简单的解决方案是将IApplicationBuilder.ApplicationServices注入您的IServiceProvider方法并将其传递到Configure:]

CreateAdminAccount

传递到public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider) { ApplicationDbContext.CreateAdminAccount(serviceProvider, Configuration) .Wait(); } IServiceProvider的实例是scoped

,这意味着您可以使用它来创建作用域服务。

这就是完成此工作所需的全部,但是在Configure中进行此类播种更为典型。这使种子关注点与配置管道分离,并且还允许使用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) => // ... } 中解析UserManager<User>RoleManager<Role>,并将它们传递给Main,而不是使用服务定位器方法。

© www.soinside.com 2019 - 2024. All rights reserved.