web-dev-qa-db-ja.com

スコープサービスインスタンスは.NET Core Consoleアプリケーションでどのように処理されますか?

これを、作成しているWebアプリケーションのConfigureServicesからコピーしました。Webから離れて、コンソールアプリまたはサービスのみを使用しようとしています。

serviceCollection.AddScoped<IDbConnection, SqlConnection>(c => new SqlConnection(App.Configuration.GetConnectionString("DefaultConnection")));

コンソールアプリは正常に動作しますが、接続の有効期間がどのように処理されるのか疑問に思っています。接続が閉じられたり破棄されたりするのはいつですか?または、これは一時的なインスタンスと同じように動作し、自分で破棄する必要がありますか?

19
ProfK

IServiceProviderからIServiceCollectionをビルドし(BuildServiceProviderメソッド)、IServiceProviderのこのインスタンスを使用してIDbConnectionを解決すると、同じインスタンスが取得されます毎回IDbConnectionです。スコープはIServiceProviderに接続されています。コンテナIServiceScopeFactoryから解決する必要のある新しいスコープを作成し、それを使用してスコープ付きのIServiceProviderを作成します。

using (var scope = scopeFactory.CreateScope())
{
   var scopedConnection = scope.ServiceProvider.GetRequiredService<IDbConnection>();      
}

スコープを配置すると接続が破棄されます。

ASPコアスコープは、新しいスコープを作成し、このスコープにアタッチされたIServiceProviderを使用してコントローラーとこのWebリクエスト内のすべてを解決するミドルウェアによって管理されます。コンソールアプリケーションでは、スコープを自分で管理する必要があります。

22