Доступ к 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();