我的理解是,使用内置的依赖项注入(inject)时,.NET Core控制台应用程序将需要您自己创建和管理所有范围,而ASP.NET Core应用程序将默认通过定义的中间件创建和管理HttpRequest范围。 )。

使用ASP.NET Core,您可以选择创建和管理自己的范围,方法是在需要CreateScope()之外的服务时调用HttpRequest

很明显,每次调用IServiceScopeFactory.CreateScope()都会创建一个新的IServiceScope。但是,每次调用IServiceProvider.CreateScope()扩展方法是否还会创建一个新的IServiceScope吗?

基本上,以下两种在ASP.NET Core和.NET Core控制台应用程序中创建作用域的方法之间存在有意义的区别:

public class Foo()
{
    public Foo(IServiceProvider serviceProvider)
    {
        using(var scope = serviceProvider.CreateScope())
        {
            scope.ServiceProvider.GetServices<>();
        }
    }
}


public class Bar()
{
    public Bar(IServiceScopeFactory scopeFactory)
    {
        using(var scope = scopeFactory.CreateScope())
        {
            scope.ServiceProvider.GetServices<>();
        }
    }
}

最佳答案

CreateScope from IServiceProvider解析IServiceScopeFactory并对其调用CreateScope():

public static IServiceScope CreateScope(this IServiceProvider provider)
{
    return provider.GetRequiredService<IServiceScopeFactory>().CreateScope();
}

所以,正如@Evk所说


IServiceProvider刚刚包装了从CreateScope()调用的IServiceScopeFactory

关于c# - .NET Core IServiceScopeFactory.CreateScope()与IServiceProvider.CreateScope()扩展,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50200200/

10-10 10:27