(非网络)主机上下文中范围服务的含义
Meaning of a Scoped Service in the context of a (non web) host
在将此问题报告为重复之前, 涵盖了 Transient、Scoped 和 Singleton 的使用,但答案和讨论的目标含义主要在 配置 WebHost 的上下文中,但我的问题与(非网络)主机上下文中这些类型的服务的含义有关,特别是对 Scoped Services 的混淆。
让我们从下面的代码开始:
在Program.cs
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Worker>();
});
我可以理解 Transient 和 Singleton 在非 Web 主机上下文中的含义。
- 每次请求时都会创建瞬态生命周期服务。 (不要与“http 请求”混淆,而是字面意思是“每次请求服务 。”)
- 单例生命周期服务适用于应用程序域的生命周期。
但无论我读到什么,http 请求上下文中的范围服务都意味着为每个(http?)请求创建一个新实例。文档和其他讨论通常针对与网络主机打交道时的行为,所以我需要澄清...
那么,在默认(非网络)HostBuilder 上配置 IServiceCollection
的上下文中,Scoped
的含义是什么?
Host.CreateDefaultBuilder(args)..ConfigureServices((hostContext, services) =>
{
services.AddHostedService<ConsumeScopedServiceHostedService>();
services.AddScoped<IScopedProcessingService, ScopedProcessingService>();
});
此外,请参阅 here 以获取实际示例。
我最接近的理解是“Scoped lifetime services are created once per request (again, not http-request, but request for the service) in the scope. 它相当于当前范围内的单例。 “ ...意味着如果您 AddScoped
在 DefaultBuilder
(非 Web 主机)上配置服务时,当从同一范围请求时,将生成一个新的、完全独立的服务实例?这个大概正确吗?
如果我离题太远,我深表歉意。谢谢你的时间。
是的,在虚拟主机中,为请求创建了生命周期范围。
在控制台应用程序、windows 服务或任何类型的应用程序(包括网络托管应用程序)中,您可以在需要时创建生命周期范围。
例如,您可以创建一个 windows 服务来按计划处理某些事情。每次计划作业 运行 时创建生命周期范围可能是有意义的。现在,在该作用域中解析并注册为作用域的所有组件在逻辑上都将作用于它。这将使您的实例按照 运行 分开,并且它们将与范围一起处理。
如果您有几种不同类型的任务 运行 独立且异步,这可能会很有用。这样,他们拥有的任何组件依赖项都将被适当地限定范围。
在将此问题报告为重复之前,
让我们从下面的代码开始:
在Program.cs
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Worker>();
});
我可以理解 Transient 和 Singleton 在非 Web 主机上下文中的含义。
- 每次请求时都会创建瞬态生命周期服务。 (不要与“http 请求”混淆,而是字面意思是“每次请求服务 。”)
- 单例生命周期服务适用于应用程序域的生命周期。
但无论我读到什么,http 请求上下文中的范围服务都意味着为每个(http?)请求创建一个新实例。文档和其他讨论通常针对与网络主机打交道时的行为,所以我需要澄清...
那么,在默认(非网络)HostBuilder 上配置 IServiceCollection
的上下文中,Scoped
的含义是什么?
Host.CreateDefaultBuilder(args)..ConfigureServices((hostContext, services) =>
{
services.AddHostedService<ConsumeScopedServiceHostedService>();
services.AddScoped<IScopedProcessingService, ScopedProcessingService>();
});
此外,请参阅 here 以获取实际示例。
我最接近的理解是“Scoped lifetime services are created once per request (again, not http-request, but request for the service) in the scope. 它相当于当前范围内的单例。 “ ...意味着如果您 AddScoped
在 DefaultBuilder
(非 Web 主机)上配置服务时,当从同一范围请求时,将生成一个新的、完全独立的服务实例?这个大概正确吗?
如果我离题太远,我深表歉意。谢谢你的时间。
是的,在虚拟主机中,为请求创建了生命周期范围。
在控制台应用程序、windows 服务或任何类型的应用程序(包括网络托管应用程序)中,您可以在需要时创建生命周期范围。
例如,您可以创建一个 windows 服务来按计划处理某些事情。每次计划作业 运行 时创建生命周期范围可能是有意义的。现在,在该作用域中解析并注册为作用域的所有组件在逻辑上都将作用于它。这将使您的实例按照 运行 分开,并且它们将与范围一起处理。
如果您有几种不同类型的任务 运行 独立且异步,这可能会很有用。这样,他们拥有的任何组件依赖项都将被适当地限定范围。