使用通用的IHostBuilder时如何获取IServiceProvider

5

我在一个.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
    // ...
}

这使我能够注册一些环境内容(使用环境上下文模式),而不是应用程序的主要依赖关系图的一部分。(正如您所看到的,我仍然使用容器来实例化它,这显然比手动新建更可取。我们可以将其视为次要的,环境依赖关系图。)

使用通用主机生成器,我们似乎永远无法访问构建的IServiceProviderIApplicationBuilder。在这种情况下,我该如何实现相同的注册?


刚刚意识到是主机构建器而不是Web。正在检查它。 - Nkosi
我明白你想做什么。我不太明白的是你想在哪里做这件事。 - Nkosi
通过查看 HostBuilder 的源代码,我们发现在创建主机之前,提供程序是最后一个构建的。目前似乎没有太多可用的可扩展性点来实现你所描述的功能。也许如果您解释一下您想要这种环境配置的确切位置,我们可以看看是否可能实现。 - Nkosi
@Nkosi,我似乎找到了一个可行的答案。我已经在下面发布了它。我认为它也回答了你想知道我想在哪里做这件事的问题。 - Timo
1个回答

4

显然,与其调用RunConsoleAsync()扩展方法,我们可以将该方法的简单步骤拆分开来,从而使我们能够在构建和启动之间进行一些操作:

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

那么 AddAmbientThingy 是直接在 IHost 上调用的吗? - Nkosi
实际上,我已将其作为扩展添加到 IHost 中,因为该接口实际上包含一个可以解析依赖项的 IServiceProvider 属性。 - Timo
完美。不错的方法。 - Nkosi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接