ASP.NET Core 3: не удается разрешить службу «Microsoft.AspNetCore.Identity.UserManager`1 [Alpha.Models.Identity.User]» из корневого поставщика. - PullRequest
0 голосов
/ 27 октября 2019

Когда я запускаю проект, я сталкиваюсь с этой проблемой: (Я использовал 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 (bool includeTaskCanceledExceptions)

InvalidOception: Не удается разрешить службу с областью действия «Microsoft.AspNetCore.Identity.UserManager`1 [Alpha.Models.Identity.User]» от корневого поставщика. Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution (Тип serviceType, область IServiceScope, 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 cancellationToken) System.Threading.Tasks.Task.Wait () Alpha.Web.App.Startup.Configure (приложение IApplicationBuilder, среда IWebHostEnvironment env) в конфигурации Startup.cs + ApplicationDbContextAcca.Apport приложения.AppH).Подождите();System. AspNetCore.Hosting.ConfigureBuilder.Invoke (экземпляр объекта, компоновщик IApplicationBuilder)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 (ОтменаCancellationToken токена) Microsoft.Extensions.Hosting.Internal.Host.StartAsync (CancellationToken cancellationToken) 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 (). Run ();

Показать необработанные сведения об исключении. InvalidOperationException: Не удалось разрешить службу с областью действия 'Microsoft.AspNetCore.Identity.UserManager`1 [Alpha.Models.Identity.User]' от корневого поставщика. Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution (Тип serviceType, область IServiceScope, IServiceScope rootScope).DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService (ТипServiceType, ServiceProviderEngineScope serviceProviderEngineScope) Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService (тип ServiceType) Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService (поставщик IServiceProvider, тип ServiceType) Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService (поставщик IServiceProvider) Альфа.DataAccess.ApplicationDbContext.CreateAdminAccount (IServiceProvider serviceProvider, конфигурация IConfiguration) в ApplicationDbContext.cs + UserManager userManager = serviceProvider.GetRequiredService> ();

Отображение необработанных исключений системы. System.Inval. .Identity.UserManager`1 [Alpha.Models.Identity.User] 'от корневого провайдера. в Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution (Тип serviceType, область действия IServiceScope, IServiceScope rootScope) в Microsoft.Extensions.DependencyInjection.ServiceProvider.Microsoft.Extensions.DependencyInerScopeServiceServiceServiceServiceServiceServiceServiceServiceServiceServiceServiceServiceServiceServiceServiceServiceServiceServiceServiceServiceServiceServiceServiceServiceServiceServiceServiceServiceServiceServiceServiceServiceServiceServiceServiceServiceServiceServiceServiceServiceServer.dll.dllMicrosoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService (тип ServiceType, serviceProviderEngineScope serviceProviderEngineScope)
в Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService (тип ServiceType) в Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService (поставщик IServiceProvider, Введите serviceType) в Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService [T] (поставщик IServiceProvider) в Alpha.DataAccess.ApplicationDbContext.CreateAdminAccount (IServiceProvider serviceProvider, IКонфигурация конфигурации) в E: \ Archives \ Projects \ Alpha \ Alpha.DataAccess \ ApplicationDbContext.cs: строка 92 .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

1 Ответ

3 голосов
/ 27 октября 2019

На скриншоте, который вы включили, показано, что у вас есть следующая строка в Startup.Configure:

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

Экземпляр IServiceProvider, хранящийся в IApplicationBuilder.ApplicationServices является root поставщиком услуг для вашего приложения. В сообщении об ошибке указывается, что он не может разрешить службу scoped от поставщика услуг root .

Эта проблема возникает часто, но самое простое решение для вашего сценария - этовведите IServiceProvider в ваш метод Configure и передайте его в CreateAdminAccount:

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

Экземпляр IServiceProvider, который передается в Configure, равен 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) =>
        // ...
}

Вы также можете разрешить UserManager<User> и RoleManager<Role> в Main и передавать их в CreateAdminAccount вместо того, чтобы использовать подход с сервис-локатором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...