ASP.NET上下文中的AddScoped
的作用域是可以理解的,即在请求级别.当涉及到控制台应用程序时,它没有请求上下文,对吗?它会有什么样的表现?
services.AddScoped<SomeServiceClass>();
.
services.AddSingleton<SomeServiceClass>();
.
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
在应用程序关闭时被处置时,单例服务被处置.由于直到应用程序关闭才会释放内存,因此可以考虑使用单例服务来使用内存.