全局检索 .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 引用并在应用程序代码中提供全局访问它的机制。
让我们考虑一下这个基于通用主机的 .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 引用并在应用程序代码中提供全局访问它的机制。