web-dev-qa-db-ja.com

.NET Core IServiceScopeFactory.CreateScope()vs IServiceProvider.CreateScope()拡張機能

私の理解では、組み込みの依存関係注入を使用する場合、.NET Coreコンソールアプリではすべてのスコープを自分で作成および管理する必要がありますが、ASP.NET CoreアプリではデフォルトでHttpRequestスコープを作成および管理します定義されたミドルウェアを介して。

ASP.NET Coreを使用すると、HttpRequestの外部に存在するサービスが必要な場合にCreateScope()を呼び出すことにより、独自のスコープをオプションで作成および管理できます。

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

IServiceProviderからCreateScopeIServiceScopeFactoryを解決し、CreateScope()を呼び出します:

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

だから、@ Evkが言ったように

機能的には両方の方法は同一です

IServiceProviderラップされた呼び出しIServiceScopeFactoryからのCreateScope()

16
Roman Marusyk