首页 > 解决方案 > 范围服务在(非 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 请求上下文中的 Scoped Service 都意味着为每个(http?)请求创建一个新实例。文档和其他讨论通常针对与网络主机打交道时的行为,所以我需要澄清......

那么,在默认(非 Web)HostBuilder 上Scoped进行配置的上下文中的含义是什么?IServiceCollection

Host.CreateDefaultBuilder(args)..ConfigureServices((hostContext, services) =>
{
    services.AddHostedService<ConsumeScopedServiceHostedService>();
    services.AddScoped<IScopedProcessingService, ScopedProcessingService>();
});

此外,请参阅此处以获取实际示例。

我得出的最接近的理解是“范围内的每个请求(再次,不是http-request,而是对服务的请求)创建一次Scoped生命周期服务。它相当于当前范围内的单例。” ...意味着如果您AddScopedDefaultBuilder(非 Web 主机)上配置服务时,当从同一范围请求时,将生成一个新的、完全独立的服务实例?这个球场正确吗?

如果我离开这里,我很抱歉。感谢您的时间。

标签: c#asp.net-coredependency-injection

解决方案


是的,在 Web 主机中,为请求创建了生命周期范围。

在控制台应用程序、Windows 服务或任何类型的应用程序(包括 Web 托管应用程序)中,您可以在需要时创建生命周期范围。

例如,您可以创建一个按计划处理某事的 Windows 服务。每次运行计划的作业时创建一个生命周期范围可能是有意义的。现在,在该范围内解析的所有注册为 scoped 的组件在逻辑上都将被限定在它的范围内。这将使您的实例在每次运行时保持独立,并且它们将与范围一起被处置。

如果您有几种不同类型的独立和异步运行的任务,这可能会很有用。这样,他们拥有的任何组件依赖项都将被正确地限定范围。


推荐阅读