全局检索 .NET 通用主机引用

Retrieving .NET generic host reference globally

让我们考虑一下这个基于通用主机的 .NET 6 简单应用程序(没有 ASP.NET)

internal sealed class Program
{
    private static async Task Main(string[] args)
    {
        await Host.CreateDefaultBuilder(args)
            .ConfigureServices((hostContext, services) =>
            {
                services.AddHostedService<MyService>();
            })
            .RunConsoleAsync();
    }
}

有没有办法全局检索 IHost 实例引用(我的意思是,没有 DI 机制)?

我正在寻找类似的东西:

IHost host = Microsoft.Extensions.Hosting.Context.CurrentHost

编辑

当然,在 Main 中我可以获取主机,但我想从代码中的任何位置在其他地方访问它(根据标题全局访问,无需创建应用程序全局变量)。 作为一个类似的例子,在 .net 中我们可以访问当前应用程序域 AppDomain.CurrentDomain.

您可以分步构建和 运行 托管:

// host can be assigned to some static field/property
// Or passed somehow else to the place where you want to use it.
var host = Host.CreateDefaultBuilder(args)
    .ConfigureServices((hostContext, services) =>
    {
       // ...
    })
    .UseConsoleLifetime()
    .Build();
await host.RunAsync();

问题的正确答案是 IHost 对象不像应用程序域。虽然 运行 应用程序有全局当前应用程序域的概念,但没有全局当前 IHost 实例的概念。应用程序中可以有多个 IHost 实例,因此应用程序代码负责跟踪它们是有意义的。 因此,正确的解决方案是存储 IHost 引用并在应用程序代码中提供全局访问它的机制。