首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >'Microsoft.AspNetCore.Identity.UserManager`1[Alpha.Models.Identity.User]‘核心3:无法从根提供程序解析作用域服务ASP.NET

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

Stack Overflow用户
提问于 2019-10-26 21:32:30
回答 1查看 7K关注 0票数 2

当我运行这个项目时,我遇到了以下问题:(我使用了asp.net core 3)。

'Microsoft.AspNetCore.Identity.UserManager`1Alpha.Models.Identity.User‘无法从根提供程序解析作用域服务

我该如何解决这个问题?

ApplicationDbContext类:

代码语言:javascript
复制
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.UserManager1[Alpha.Models.Identity.User]' from root provider.) System.Threading.Tasks.Task.ThrowIfExceptional(bool includeTaskCanceledExceptions) InvalidOperationException: Cannot resolve scoped service 'Microsoft.AspNetCore.Identity.UserManager1Alpha.Models.Identity.User‘。Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(Type serviceType,IServiceScope范围,IServiceScope rootScope)

AggregateException:发生了一个或多个错误。(无法从根提供程序解析作用域服务'Microsoft.AspNetCore.Identity.UserManager1[Alpha.Models.Identity.User]' from root provider.) System.Threading.Tasks.Task.ThrowIfExceptional(bool includeTaskCanceledExceptions) System.Threading.Tasks.Task.Wait(int millisecondsTimeout, CancellationToken cancellationToken) System.Threading.Tasks.Task.Wait() Alpha.Web.App.Startup.Configure(IApplicationBuilder app, IWebHostEnvironment env) in Startup.cs + ApplicationDbContext.CreateAdminAccount(app.ApplicationServices, Configuration).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, CultureInfo culture) Microsoft.AspNetCore.Hosting.ConfigureBuilder.Invoke(object instance, IApplicationBuilder builder) Microsoft.AspNetCore.Hosting.ConfigureBuilder+<>c\_\_DisplayClass4\_0.b\_\_0(IApplicationBuilder builder) Microsoft.AspNetCore.Hosting.GenericWebHostBuilder+<>c\_\_DisplayClass13\_0.b\_\_2(IApplicationBuilder app) 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+<>c\_\_DisplayClass0\_0.b\_\_0(IApplicationBuilder app) Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken) Microsoft.Extensions.Hosting.Internal.Host.StartAsync(CancellationToken cancellationToken) Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token) Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token) Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.Run(IHost host) Alpha.Web.App.Program.Main(string[] args) in Program.cs + CreateHostBuilder(args).Build().Run(); Show raw exception details InvalidOperationException: Cannot resolve scoped service 'Microsoft.AspNetCore.Identity.UserManager1Alpha.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 serviceType,IServiceScope scope) Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType,ServiceProviderEngineScope serviceProviderEngineScope) Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType) Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider提供者,Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider提供者( Alpha.DataAccess.ApplicationDbContext.CreateAdminAccount(IServiceProvider serviceProvider,IConfiguration configuration)在ApplicationDbContext.cs + UserManager userManager =serviceProvider.GetRequiredService>()中输入;

显示原始异常详细信息System.InvalidOperationException:无法从根提供程序解析作用域服务System.InvalidOperationException。在Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(Type serviceType,IServiceScope scope,IServiceScope rootScope at Microsoft.Extensions.DependencyInjection.ServiceProvider.Microsoft.Extensions.DependencyInjection.ServiceLookup.IServiceProviderEngineCallback.OnResolve(Type serviceType,IServiceScope scope)在Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType,ServiceProviderEngineScope serviceProviderEngineScope)

(在Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType)在Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider上,在Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredServiceT at Alpha.DataAccess.ApplicationDbContext.CreateAdminAccount(IServiceProvider serviceProvider (输入serviceType),( E:\Archives\Projects\Alpha\Alpha.DataAccess\ApplicationDbContext.cs:line 92 .NET Core 3.0.0 X64 v4.0.0.0 Microsoft.AspNetCore.Hosting version 3.0.0-rc2.19465.2 \MicrosoftWindows10.0.17763 X64)中的.NET配置

需要帮助吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-26 22:15:37

从包含的屏幕截图中可以看出,在Startup.Configure中有下面一行

代码语言:javascript
复制
ApplicationDbContext.CreateAdminAccount(app.ApplicationServices, Configuration)
    .Wait();

存储在IServiceProvider中的IApplicationBuilder.ApplicationServices实例是应用程序的根服务提供程序。错误消息声明它无法解析根服务提供程序的作用域服务。

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

代码语言:javascript
复制
public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider)
{
    ApplicationDbContext.CreateAdminAccount(serviceProvider, Configuration)
        .Wait();
}

传递给IServiceProviderConfigure实例是作用域,这意味着您可以使用它创建作用域服务。

这就是您需要做的全部工作,但是在Program中执行这种类型的种子比较典型。这使得种子问题与配置管道分离,并且还允许使用async/await。下面是一个例子:

代码语言:javascript
复制
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>中解析MainRoleManager<Role>,并将它们传递给CreateAdminAccount,而不是让它使用服务定位器方法。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58574899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档