web-dev-qa-db-fra.com

Comment une instance de service étendue est-elle gérée dans une application de console .NET Core?

J'ai copié cela à partir de ConfigureServices dans une application Web que je construis, où j'essaie de m'éloigner du Web et d'utiliser uniquement une application ou un service de console:

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

L'application console fonctionne bien, mais je me demande comment la durée de vie de la connexion est gérée. Si et quand la connexion est-elle fermée et/ou supprimée? Ou cela se comporte-t-il comme une instance transitoire, et je devrais m'en débarrasser moi-même?

19
ProfK

Lorsque vous générez IServiceProvider à partir de IServiceCollection (méthode BuildServiceProvider) et que vous utilisez cette instance de IServiceProvider pour résoudre IDbConnection, vous obtiendrez la même instance de IDbConnection à chaque fois. La portée est connectée à IServiceProvider. pour créer une nouvelle étendue que vous devez résoudre à partir du conteneur IServiceScopeFactory et l'utiliser pour créer IServiceProvider qui est délimité:

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

La connexion sera supprimée lorsque la portée sera supprimée.

Dans ASP Les portées principales sont gérées pour vous par un middleware qui crée une nouvelle portée et utilise ensuite IServiceProvider attaché à cette portée pour résoudre Controller et tout ce qui se trouve dans cette demande Web. Dans l'application console, vous besoin de gérer vous-même les étendues.

22
Krzysztof Branicki