c# - 范围服务在(非 Web)主机上下文中的含义
问题描述
在将此问题报告为重复之前,此 SO Question涵盖了 Transient、Scoped 和 Singleton 的使用,但答案和讨论的目标含义主要在配置 WebHost 的上下文中,但我的问题与这些类型的服务的含义有关在(非网络)主机的上下文中,特别是对范围服务的混淆。
让我们从下面的代码开始:
在 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 请求上下文中的 Scoped Service 都意味着为每个(http?)请求创建一个新实例。文档和其他讨论通常针对与网络主机打交道时的行为,所以我需要澄清......
那么,在默认(非 Web)HostBuilder 上Scoped
进行配置的上下文中的含义是什么?IServiceCollection
Host.CreateDefaultBuilder(args)..ConfigureServices((hostContext, services) =>
{
services.AddHostedService<ConsumeScopedServiceHostedService>();
services.AddScoped<IScopedProcessingService, ScopedProcessingService>();
});
此外,请参阅此处以获取实际示例。
我得出的最接近的理解是“范围内的每个请求(再次,不是http-request,而是对服务的请求)创建一次Scoped生命周期服务。它相当于当前范围内的单例。” ...意味着如果您AddScoped
在DefaultBuilder
(非 Web 主机)上配置服务时,当从同一范围请求时,将生成一个新的、完全独立的服务实例?这个球场正确吗?
如果我离开这里,我很抱歉。感谢您的时间。
解决方案
是的,在 Web 主机中,为请求创建了生命周期范围。
在控制台应用程序、Windows 服务或任何类型的应用程序(包括 Web 托管应用程序)中,您可以在需要时创建生命周期范围。
例如,您可以创建一个按计划处理某事的 Windows 服务。每次运行计划的作业时创建一个生命周期范围可能是有意义的。现在,在该范围内解析的所有注册为 scoped 的组件在逻辑上都将被限定在它的范围内。这将使您的实例在每次运行时保持独立,并且它们将与范围一起被处置。
如果您有几种不同类型的独立和异步运行的任务,这可能会很有用。这样,他们拥有的任何组件依赖项都将被正确地限定范围。
推荐阅读
- java - Java / JSON.simple - 在斜杠之前打印反斜杠
- angularjs - Angular JS 中 focus-next 自定义指令的测试用例
- r - 仅当使用 dplyr 被相同的值“夹在中间”时才填充 NA
- xamarin.forms - 用星号而不是点 xamarin.iOS 隐藏 UITextField 密码
- javascript - 如何处理奇怪组合的 websocket 消息?
- php - 如何正确衡量脚本的性能?
- sql - 创建从两个不同的日期和项目给出的日期的递归列表
- css - 这段代码中 :before 属性的目的是什么?
- objective-c - 在Objective C中合并具有不同标题图块的多个csv文件
- javascript - 为什么这个html5画布动画这么密集?