Как получить экземпляр службы в ASP. NET Core 3.1 - PullRequest
2 голосов
/ 16 января 2020

У меня небольшой проект. NET Core 2.0, и, как Microsoft объявила, что больше не будет поддерживать. NET Core 2.0 Я попытался обновить проект до последней версии - 3.1. Но я с трудом настраивал внедрение зависимостей и мне нужна помощь.

Чтобы заполнить базу данных, мне нужно получить необходимые сервисы, такие как Db Context и пользовательскую конфигурацию, и передать это классу DbInitialize, как показано ниже. Я делал это в Program.cs до конфигурации Startup.cs.

public class Program {
        public static void Main(string[] args)
        {

            var host = BuildWebHost(args);

            using (var scope = host.Services.CreateScope())
            {
                var services = scope.ServiceProvider;
                try
                {
                    var context = services.GetRequiredService<GameStoreContext>();
                    var configuration = services.GetRequiredService<IConfiguration>();
                    var userManager = services.GetRequiredService<UserManager<IdentityUser>>();
                    var roleManager = services.GetRequiredService<RoleManager<IdentityRole>>();
                    DbInitializer.Initialize(context, configuration, userManager,roleManager).GetAwaiter().GetResult();
                }
                catch (Exception ex)
                {
                    var logger = services.GetRequiredService<ILogger<Program>>();
                    logger.LogError(ex, "An error occurred while seeding the database.");
                }
            }
            host.Run();
        }

        public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .Build();
    }

Но в. NET версии Core 3.1 версии BuildWebHost больше нельзя создавать, поэтому я не смог получить такие службы, как этот.

Новая версия Program.cs in. NET Core 3.1 выглядит следующим образом

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

Есть ли способ, с помощью которого я могу достичь того же результата в новой платформе?

OBS: я читал в некоторых публикациях людей, которые советуют использовать IConfiguration, но я не смог найти ни одного примера.

1 Ответ

3 голосов
/ 16 января 2020

Я понимаю, что вы хотите получить экземпляр вашего DBContext. И выполнить некоторый код с ним. Здесь я приведу пример автоматического заполнения базы данных при запуске ASP. NET Core 3.1. Вы можете попробовать следующий код или попробовать решение вашей проблемы.

Сначала скопируйте следующий код в ваш проект:

public static IHost MigrateDbContext<TContext>(this IHost host) where TContext : DbContext
{
    // Create a scope to get scoped services.
    using (var scope = host.Services.CreateScope())
    {
        var services = scope.ServiceProvider;
        var logger = services.GetRequiredService<ILogger<TContext>>();
        // get the service provider and db context.
        var context = services.GetService<TContext>();

        // do something you can customize.
        // For example, I will migrate the database.
        context.Database.Migrate();
    }

    return host;
}

Он создает расширенный метод для IHost, который позволяет вам обновить вашу базу данных автоматически после запуска приложения. Он использует поставщика услуг по умолчанию вашего приложения, чтобы создать область и получить ваш DBContext. И попробуйте перевести базу данных в последний статус.

Если ваша база данных пуста или не существует вообще, сценарий также может автоматически создать вашу базу данных.

Наконец, используйте метод extend в процессе запуска. Например:

public static void Main(string[] args)
{
    CreateHostBuilder(args)
        .Build()
        .MigrateDbContext<WikiDbContext>() // <-- call it here like this.
        .Run();
}

public static IHostBuilder CreateHostBuilder(string[] args)
{
    return Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder => webBuilder.UseStartup<Startup>());
}

Попробуйте запустить приложение и проверьте, может ли оно успешно выполнить процесс обновления.

Когда вы выполняете другие ef команды, такие как dotnet ef migrations add Test и Сценарий не будет выполнен. Ваша база данных остается прежней.

Надеюсь, это поможет.

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