На скриншоте, который вы включили, показано, что у вас есть следующая строка в 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
вместо того, чтобы использовать подход с сервис-локатором.