2017-07-01 106 views
5

我在一個Web應用程序複製這個從ConfigureServices我建,在那裏我試圖從網上移開,並且只使用一個控制檯應用程序或服務:如何在.NET Core控制檯應用程序中處理Scoped服務實例?

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

控制檯應用程序工作正常,但我想知道如何處理連接的生命週期。如果連接何時關閉和/或處置?或者它的行爲與暫時的實例相同,我應該自己處理它?

回答

6

當你建立IServiceProviderIServiceCollectionBuildServiceProvider法),並且使用的IServiceProvider這種情況下,解決IDbConnection你會得到的每一次IDbConnection相同的實例。範圍連接到IServiceProvider。創建新的範圍,你需要從容器IServiceScopeFactory解決,並用它來創建IServiceProvider範圍限定:範圍設置時

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

連接將被佈置。

在ASP中,通過創建新範圍的中間件來管理核心作用域,然後使用附加到此作用域的IServiceProvider來解析Controller和此Web請求中的所有內容。在控制檯應用程序中,您需要自己管理範圍。

+0

scopeFactory如何與服務集合連接? –

+0

'IServiceScopeFactory'由框架在'IServiceCollection'中自動註冊,因此您無需手動註冊。稍後,您可以簡單地從'IServiceProvider'解決它。 –

相關問題