これを、作成しているWebアプリケーションのConfigureServices
からコピーしました。Webから離れて、コンソールアプリまたはサービスのみを使用しようとしています。
serviceCollection.AddScoped<IDbConnection, SqlConnection>(c => new SqlConnection(App.Configuration.GetConnectionString("DefaultConnection")));
コンソールアプリは正常に動作しますが、接続の有効期間がどのように処理されるのか疑問に思っています。接続が閉じられたり破棄されたりするのはいつですか?または、これは一時的なインスタンスと同じように動作し、自分で破棄する必要がありますか?
IServiceProvider
からIServiceCollection
をビルドし(BuildServiceProvider
メソッド)、IServiceProvider
のこのインスタンスを使用してIDbConnection
を解決すると、同じインスタンスが取得されます毎回IDbConnection
です。スコープはIServiceProvider
に接続されています。コンテナIServiceScopeFactory
から解決する必要のある新しいスコープを作成し、それを使用してスコープ付きのIServiceProvider
を作成します。
using (var scope = scopeFactory.CreateScope())
{
var scopedConnection = scope.ServiceProvider.GetRequiredService<IDbConnection>();
}
スコープを配置すると接続が破棄されます。
ASPコアスコープは、新しいスコープを作成し、このスコープにアタッチされたIServiceProvider
を使用してコントローラーとこのWebリクエスト内のすべてを解決するミドルウェアによって管理されます。コンソールアプリケーションでは、スコープを自分で管理する必要があります。