簡體   English   中英

ASP.NET 核心 3:無法從根提供商解析范圍服務“Microsoft.AspNetCore.Identity.UserManager`1[Alpha.Models.Identity.User]”

[英]ASP.NET Core 3: Cannot resolve scoped service 'Microsoft.AspNetCore.Identity.UserManager`1[Alpha.Models.Identity.User]' from root provider

運行項目時,遇到這個問題:(我用過asp.net core 3 。)

無法從根提供程序解析范圍服務“Microsoft.AspNetCore.Identity.UserManager`1[Alpha.Models.Identity.User]”。

我怎么解決這個問題?

ApplicationDbContext class:

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(bool includeTaskCanceledExceptions)

InvalidOperationException:無法從根提供程序解析范圍服務“Microsoft.AspNetCore.Identity.UserManager`1[Alpha.Models.Identity.User]”。 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(類型 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 Startup.cs + ApplicationDbContext.CreateAdminAccount(app.ApplicationServices, Configuration) 中的 .Wait(int millisecondsTimeout, CancellationToken cancelToken) System.Threading.Tasks.Task.Wait() )。等待(); System.RuntimeMethodHandle.InvokeMethod(object target, object[] arguments, Signature sig, bool constructor, bool wrapExceptions) System.Reflection.RuntimeMethodInfo.Invoke(object obj, BindingFlags invokeAttr, Binder binder, object[] parameters, CultureInfoculture) 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 builder) Microsoft.AspNetCore.Server.IIS.Core.IISServerSetupFilter+<>c__DisplayClass2_0.b__0(IApplicationBuilder app) Microsoft.AspNetCore.HostFilteringStartupFilter+(IcApplicationBuilder app)0_0.StartupFilter+(IcApplicationBuilder app)0_0.StartupFilter+微軟.AspNetCo re.Hosting.GenericWebHostService.StartAsync(CancellationToken cancelToken) Microsoft.Extensions.Hosting.Internal.Host.StartAsync(CancellationToken cancelToken) Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token) Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions。 RunAsync(IHost 主機,CancellationToken 令牌)Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.Run(IHost 主機)Alpha.Web.App.Program.Main(string[] args) 在 Program.cs + CreateHostBuilder(args).Build()。跑();

顯示原始異常詳細信息 InvalidOperationException:無法從根提供程序解析范圍服務“Microsoft.AspNetCore.Identity.UserManager`1[Alpha.Models.Identity.User]”。 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(類型 serviceType,IServiceScope scope,IServiceScope rootScope)Microsoft.Extensions.DependencyInjection.ServiceProvider.Microsoft.Extensions.DependencyInjection.ServiceLookup.IServiceProviderEngineCallback.OnResolve(類型 serviceType,IServiceScope 范圍)Microsoft。 .DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope) Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType) Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType) Microsoft.Extensions。 DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider) Alpha.DataAccess.ApplicationDbContext.CreateAdminAccount(IServiceProvider serviceProvider, IC onfiguration 配置)在 ApplicationDbContext.cs + UserManager userManager = serviceProvider.GetRequiredService>();

顯示原始異常詳細信息 System.InvalidOperationException:無法從根提供商解析范圍服務“Microsoft.AspNetCore.Identity.UserManager`1[Alpha.Models.Identity.User]”。 在 Microsoft.Extensions.DependencyInjection.ServiceProvider.Microsoft.Extensions.DependencyInjection.ServiceLookup.IServiceProviderEngineCallback.OnResolve(鍵入 serviceType,IServiceScope scope,IServiceScope rootScope)處的 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(鍵入 serviceType,IServiceScope 范圍) Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(類型 serviceType,ServiceProviderEngineScope serviceProviderEngineScope)
在 Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType) 在 Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType) 在 Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)在 E:\Archives\Projects\Alpha\Alpha.DataAccess\ApplicationDbContext.cs:line 92 .NET Core 3.0.0 X64 v4.0.0.0 中的 Alpha.DataAccess.ApplicationDbContext.CreateAdminAccount(IServiceProvider serviceProvider, IConfiguration 配置) | Microsoft.AspNetCore.Hosting 版本 3.0.0-rc2.19465.2 | 微軟 Windows 10.0.17763 |
需要幫忙?

錯誤詳情

從您包含的屏幕截圖中,它表明您在Startup.Configure中有以下行:

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

存儲在IApplicationBuilder.ApplicationServices中的IServiceProvider實例是應用程序的服務提供者。 錯誤消息指出它無法從服務提供商解析范圍服務。

這個問題經常出現,但最簡單的解決方案是將IServiceProvider注入您的Configure方法並將其傳遞給CreateAdminAccount

public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider)
{
    ApplicationDbContext.CreateAdminAccount(serviceProvider, Configuration)
        .Wait();
}

傳遞給ConfigureIServiceProvider實例是scoped ,這意味着您可以使用它來創建范圍服務。

這就是完成這項工作所需的全部內容,但在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) =>
        // ...
}

您也可以在Main中解析UserManager<User>RoleManager<Role> ,並將它們傳遞給CreateAdminAccount而不是讓它使用服務定位器方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM