Доступ к IServiceProvider при использовании универсального IHostBuilder

Я использую IHostBuilder в консольном приложении.NET Core 2.1. Главное выглядит так:

    public static async Task Main(string[] args)
    {
        var hostBuilder = new HostBuilder()
            .UseServiceProviderFactory(new AutofacServiceProviderFactory())
            .ConfigureServices(services =>
            {
                // Register dependencies
                // ...

                // Add the hosted service containing the application flow
                services.AddHostedService<RoomService>();
            });

        await hostBuilder.RunConsoleAsync();
    }
}

До того, как IWebHostBuilderЯ имел Configure() метод, который позволил мне сделать это:

public void Configure(IApplicationBuilder applicationBuilder, IHostingEnvironment environment)
{
    // Resolve something unrelated to the primary dependency graph
    var thingy = applicationBuilder.ApplicationServices.GetRequiredService<Thingy>();
    // Register it with the ambient context
    applicationBuilder.AddAmbientThingy(options => options.AddSubscriber(thingy));

    // Use MVC or whatever
    // ...
}

Это позволило мне зарегистрировать что-то окружающее (используя шаблон Ambient Context), а не часть основного графика зависимостей приложения. (Как вы можете видеть, я все еще использую контейнер для его создания, что, безусловно, предпочтительнее, чем обновлять его вручную. Мы можем видеть его как вторичный, внешний граф зависимостей.)

С универсальным компоновщиком хостов мы никогда не получаем доступ к встроенным IServiceProvider или IApplicationBuilder, Как мне добиться такой же регистрации в этом случае?

1 ответ

Решение

Видимо, вместо вызова RunConsoleAsync() Кроме того, мы можем разделить простые шаги, которые выполняет этот метод, что позволяет нам что-то делать между сборкой и запуском:

        await hostBuilder
            .UseConsoleLifetime()
            .Build()
            .AddAmbientThingy(options => options.AddSubscriber(thingy))
            .RunAsync();
Другие вопросы по тегам