我在一个.NET Core 2.1控制台应用程序中使用IHostBuilder
。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
// ...
}
这使我能够注册一些环境内容(使用环境上下文模式),而不是应用程序的主要依赖关系图的一部分。(正如您所看到的,我仍然使用容器来实例化它,这显然比手动新建更可取。我们可以将其视为次要的,环境依赖关系图。)
使用通用主机生成器,我们似乎永远无法访问构建的IServiceProvider
或IApplicationBuilder
。在这种情况下,我该如何实现相同的注册?
HostBuilder
的源代码,我们发现在创建主机之前,提供程序是最后一个构建的。目前似乎没有太多可用的可扩展性点来实现你所描述的功能。也许如果您解释一下您想要这种环境配置的确切位置,我们可以看看是否可能实现。 - Nkosi