ASP.NET上下文中的AddScoped的作用域是可以理解的,即在请求级别.当涉及到控制台应用程序时,它没有请求上下文,对吗?它会有什么样的表现?

services.AddScoped<SomeServiceClass>();. services.AddSingleton<SomeServiceClass>();.

推荐答案

在请求级别.当涉及到控制台应用程序时,它没有请求上下文,对吗?

是的,在ASP.NET中,核心框架将按请求创建作用域.在控制台应用程序中,没有现成的"请求"概念,但您可以在需要时手动创建作用域(当您有一些迭代和/或长期运行的处理时,这会很有用,例如涉及EF CoreDbContext‘S):

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();
}

在启用作用域验证的情况下,作用域服务的主要区别不能从根作用域解决(这样做是为了防止类似于captive dependencies"引入"的负面影响):

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 dependency injection: Service lifetimes个文档中:

Scoped

  • 对于Web应用程序,作用域生存期表示每个客户端请求(连接)创建一次服务.向AddScope注册作用域服务.
  • 在处理请求的应用程序中,作用域服务在请求的末尾部署.
  • 使用实体框架核心时,默认情况下,AddDbContext扩展方法注册具有作用域生存期的DbContext类型.

Singleton
Singleton lifetime services are created either:

  • 他们第一次被要求的时候.
  • 由开发人员在将实现实例直接提供给容器时提供.

来自依赖注入容器的服务实现的每个后续请求都使用相同的实例.

单例服务必须是线程安全的,并且通常用于无状态服务.

在处理请求的应用程序中,当ServiceProvider在应用程序关闭时被处置时,单例服务被处置.由于直到应用程序关闭才会释放内存,因此可以考虑使用单例服务来使用内存.

Csharp相关问答推荐

在Microsoft XNA框架(MonoGame)中旋转相机

在实际上是List T的 IESEARCH上多次调用First()是否不好?

如何使嵌套for-loop更高效?

Microsoft. SQLServer. Types(106.1000.6)在try 从用户定义的类型检索值时引发异常

找不到网址:https://localhost:7002/Category/Add?区域= Admin.为什么我的URL是这样生成的?area = Admin而不是/Admin/

ASP.NET Core 8.0 JWT验证问题:尽管令牌有效,但SecurityTokenNoExpirationError异常

如何在C#中使用正则表达式抓取用逗号分隔的两个单词?

更新产品但丢失产品ASP.NET Core的形象

不带身份的Blazor服务器.Net 8 Cookie身份验证

如何使用MoQ模拟Resources GroupCollection?

Regex字母数字校验

如何在.NET AOT中为所有枚举启用JsonStringEnumConverter

将操作从编辑页重定向到带参数的索引页

为什么Docker中没有转发该端口?

为什么此名称不再被识别?名称不存在于当前上下文中?

源代码生成器项目使用`dotnet build`编译,而不是在Visual Studio中编译?

如何避免在.NET中将日志(log)写入相对路径

为什么我的用户界面对象移动到略低于实际目标?

为什么我可以在注册表编辑器中更改值,但不能在以管理员身份运行的C#表单应用程序中更改?

ASP.NET核心MVC|如何在控制器方法之间传递值