在.net核心控制台应用程序中,AddScoped和AddSingleton有什么区别?

icomxhvb  于 2023-11-20  发布在  .NET
关注(0)|答案(3)|浏览(162)

在ASP.NET上下文中,AddScoped的作用域是可以理解的,也就是说,在请求级别。当涉及到控制台应用程序时,它没有请求上下文,对吗?它将如何表现?
services.AddScoped<SomeServiceClass>();services.AddSingleton<SomeServiceClass>();

fcwjkofz

fcwjkofz1#

在控制台应用程序中,没有像Web上下文中那样内置的请求概念。因此,如果您在控制台应用程序中使用依赖注入(DI),则必须手动管理服务的范围。

using (var scope = serviceProvider.CreateScope())
{
    var service = scope.ServiceProvider.GetRequiredService<SomeServiceClass>();
    // use service here
}

字符串
但单例的行为是一样的

mwecs4sa

mwecs4sa2#

在请求级别。当涉及到控制台应用程序时,它没有请求上下文,对吗?
是的,在ASP.NET Core框架中,将根据请求创建作用域。在控制台应用程序中,没有“请求”的概念,但您可以在需要时手动创建作用域(当您有一些迭代和/或长时间运行的处理时,这可能是有益的,例如涉及EF Core DbContext的):

var services = new ServiceCollection();
// services.Add...
var serviceProvider = services.BuildServiceProvider();

while (some_condition)
{
    using var scope = serviceProvider.CreateScope();

    var service = scope.ServiceProvider.GetRequiredService<ISomeService>();
    service.DoSomething();
}

字符串
启用了作用域验证的作用域服务不能从根作用域解析的主要区别(这样做是为了防止类似于捕获依赖“引入”的负面影响):

var services = new ServiceCollection();
// services.Add...
services.AddScoped<object>();
var serviceProvider = services.BuildServiceProvider(new ServiceProviderOptions
{
    ValidateScopes = true, // can be detrimental for perf, disable on Prod
    // ValidateOnBuild = true
});

// InvalidOperationException: Cannot resolve scoped service 'System.Object' from root provider:
var service = serviceProvider.GetRequiredService<object>();


来自.NET依赖注入:服务生命周期文档:

范围

  • 对于Web应用程序,限定范围的生存期表示每个客户端请求(连接)创建一次服务。使用AddScoped注册限定范围的服务。
  • 在处理请求的应用中,范围服务在请求的末尾释放。
  • 使用Entity Framework Core时,AddDbContext扩展方法默认情况下使用限定了作用域的生存期注册DbContext类型。
    新加坡

Singleton生命周期服务可以创建为:

  • 他们第一次被要求。
  • 由开发人员直接向容器提供实现示例时。

来自依赖注入容器的服务实现的每个后续请求都使用相同的示例。
单例服务必须是线程安全的,并且通常用于无状态服务。
在处理请求的应用中,当ServiceProvider在应用关闭时被释放时,单例服务被释放。因为内存直到应用关闭时才被释放,所以考虑单例服务的内存使用。

mkh04yzy

mkh04yzy3#

尽管这与Web应用程序的依赖注入不同,但概念是相同的。
AddScoped:

  • 每个作用域创建一次服务。在Web应用程序的上下文中,这通常意味着每个HTTP请求创建一次。
  • 在控制台应用程序性质中,范围可能与特定操作相关。

AddSingleton:

  • 服务只创建一次,并在应用程序的生命周期内重复使用
  • 在控制台应用程序中,这意味着服务在第一次请求时创建,并在整个应用程序期间重用。

通过官方文档阅读更多关于依赖注入的信息

相关问题