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?
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.