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>();
3条答案
按热度按时间fcwjkofz1#
在控制台应用程序中,没有像Web上下文中那样内置的请求概念。因此,如果您在控制台应用程序中使用依赖注入(DI),则必须手动管理服务的范围。
字符串
但单例的行为是一样的
mwecs4sa2#
在请求级别。当涉及到控制台应用程序时,它没有请求上下文,对吗?
是的,在ASP.NET Core框架中,将根据请求创建作用域。在控制台应用程序中,没有“请求”的概念,但您可以在需要时手动创建作用域(当您有一些迭代和/或长时间运行的处理时,这可能是有益的,例如涉及EF Core
DbContext
的):字符串
启用了作用域验证的作用域服务不能从根作用域解析的主要区别(这样做是为了防止类似于捕获依赖“引入”的负面影响):
型
来自.NET依赖注入:服务生命周期文档:
范围
新加坡
Singleton生命周期服务可以创建为:
来自依赖注入容器的服务实现的每个后续请求都使用相同的示例。
单例服务必须是线程安全的,并且通常用于无状态服务。
在处理请求的应用中,当
ServiceProvider
在应用关闭时被释放时,单例服务被释放。因为内存直到应用关闭时才被释放,所以考虑单例服务的内存使用。mkh04yzy3#
尽管这与Web应用程序的依赖注入不同,但概念是相同的。
AddScoped:
AddSingleton:
通过官方文档阅读更多关于依赖注入的信息