5

j'ai copié ce billet depuis ConfigureServices dans une application web que je construis, où je suis en train de se éloigner du web et utiliser uniquement une application console ou service:Comment une instance de service Scoped est-elle gérée dans une application .NET Core Console?

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

L'application de la console fonctionne très bien, mais Je me demande comment la vie de la connexion est gérée. Si et quand la connexion est-elle fermée et/ou éliminée? Ou cela se comporte-t-il de la même manière qu'une instance transitoire, et je devrais le faire moi-même?

Répondre

6

Lorsque vous construisez IServiceProvider de IServiceCollection (méthode BuildServiceProvider) et que vous utilisez cette instance de IServiceProvider pour résoudre IDbConnection vous obtiendrez même instance de IDbConnection chaque fois. La portée est connectée à IServiceProvider. pour créer de nouvelles possibilités dont vous avez besoin pour résoudre du récipient IServiceScopeFactory et l'utiliser pour créer IServiceProvider qui est scope:

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

Connection sera éliminé lorsque la portée est disposé.

Dans ASP Core Scopes sont gérés pour vous par middleware qui crée une nouvelle portée et utilise IServiceProvider attaché à cette étendue pour résoudre contrôleur et tout dans cette demande Web. Dans l'application console, vous devez gérer vous-même les étendues.

+0

Comment un scopeFactory est-il connecté à une collection de services? –

+0

'IServiceScopeFactory' est automatiquement enregistré dans' IServiceCollection' par le framework de sorte que vous n'avez pas besoin de l'enregistrer manuellement. Plus tard, vous pouvez simplement le résoudre à partir de 'IServiceProvider'. –