Доступ к IServiceProvider при использовании универсального IHostBuilder - PullRequest
0 голосов
/ 26 ноября 2018

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

    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 Ответ

0 голосов
/ 27 ноября 2018

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

        await hostBuilder
            .UseConsoleLifetime()
            .Build()
            .AddAmbientThingy(options => options.AddSubscriber(thingy))
            .RunAsync();
...