2017-07-01 11 views
5

私は離れてウェブから移動し、唯一のコンソールアプリケーションやサービスを使用しようとしている私が構築していたWebアプリケーションにConfigureServicesからこれをコピーします。コンソールアプリが正常に動作しますスコープ付きサービスインスタンスは.NET Core Consoleアプリケーションでどのように処理されますか?

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

を、しかし、私は接続の寿命がどのように処理されているのだろうかと思います。接続が閉じていて、いつ廃棄されるのか?またはこれは一時的なインスタンスと同じように動作しますか?それを自分で処理する必要がありますか?

答えて

6

あなたはIServiceProviderIServiceCollectionから(BuildServiceProvider法)を構築し、あなたがIDbConnectionを解決するためにIServiceProviderのこのインスタンスを使用するときは、IDbConnection毎回の同じインスタンスを取得します。スコープはIServiceProviderに接続されています。新しいスコープを作成するために、あなたは、コンテナIServiceScopeFactoryから解決とスコープさIServiceProviderを作成するためにそれを使用する必要があります。スコープが配置されているとき

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

接続が配置されます。

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

+0

scopeFactoryはサービスコレクションにどのように接続されていますか? –

+0

'IServiceScopeFactory'はフレームワークによって自動的に' IServiceCollection'に登録されるので、手動で登録する必要はありません。後で 'IServiceProvider'から簡単に解決できます。 –

関連する問題