Вы не можете выполнять заполнение данных на веб-хосте builder , поскольку в то время поставщик услуг еще не был создан.Вместо этого вам придется сначала создать веб-хостинг, прежде чем вы сможете разрешить любые ранее зарегистрированные сервисы.
Моя обычная рекомендация - выполнить начальное заполнение в Program.cs
после создания WebHost
.,Следуя шаблону по умолчанию, я бы настроил метод Main
, чтобы он выглядел следующим образом:
public static async Task Main(string[] args)
{
var host = CreateWebHostBuilder(args).Build();
using (var scope = host.Services.CreateScope())
{
var roleManager = scope.ServiceProvider.GetService<RoleManager<MyWebRole>>();
if (!await roleManager.RoleExistsAsync("admin"))
await roleManager.CreateAsync(new MyWebRole { Name = "admin" });
}
await host.RunAsync();
}
Таким образом, это сначала создаст веб-хост, а затем создаст область внедрения зависимостей, из которой он разрешитRoleManager
экземпляр.Используя этого менеджера, вы сможете создавать нужные вам роли.
Для этого вы также можете создать отдельный сервис, поэтому вам не нужно будет располагать всей этой логикой внутри Program.cs
, а просто полагаться на некоторые другие.Служба для выполнения заполнения данных:
public static async Task Main(string[] args)
{
var host = CreateWebHostBuilder(args).Build();
using (var scope = host.Services.CreateScope())
{
var dataSeeder = scope.ServiceProvider.GetService<DataSeeder>();
await dataSeeder.EnsureSeedDataAsync();
}
await host.RunAsync();
}
Затем DataSeeder
будет зарегистрирован в контейнере внедрения зависимостей.И тогда он может принять RoleManager
и другие службы (например, опции или даже контекст базы данных) в качестве зависимости и выполнить заполнение в методе EnsureSeedDataAsync
.
Альтернативой может быть использование Entity Framework Базовая функциональность заполнения данных с использованием вызова метода .HasData()
в конструкторе моделей.Однако для этого необходимы фиксированные идентификаторы для ваших объектов роли, и вам также придется создавать объекты на уровне базы данных, а не полагаться на более высокий уровень RoleManager
.