32 votes

Comment créer une portée enfant à partir du parent avec l'injection de dépendance par défaut dans .NET Core ?

Je construis une application console .NET Core. Elle exécute périodiquement une méthode qui effectue un travail. Comment faire pour que le ServiceProvider se comporte de la même manière que dans les applications ASP.NET Core ? Je veux qu'il résolve les services scopés lorsque la méthode commence son exécution et qu'il dispose des services résolus à la fin de la méthode.

// pseudocode

globalProvider.AddScoped<ExampleService>();

// ...

using (var scopedProvider = globalProvider.CreateChildScope())
{
    var exampleService = scopedProvider.Resolve<ExampleService>();
}

53voto

Ilya Chumakov Points 9808

Utilice IServiceProvider.CreateScope() pour créer une portée locale :

var services = new ServiceCollection();
services.AddScoped<ExampleService>();
var globalProvider = services.BuildServiceProvider();

using (var scope = globalProvider.CreateScope())
{
    var localScoped = scope.ServiceProvider.GetService<ExampleService>();

    var globalScoped = globalProvider.GetService<ExampleService>();
}

Il peut être facilement testé :

using (var scope = globalProvider.CreateScope())
{
    var localScopedV1 = scope.ServiceProvider.GetService<ExampleService>();
    var localScopedV2 = scope.ServiceProvider.GetService<ExampleService>();
    Assert.Equal(localScopedV1, localScopedV2);

    var globalScoped = globalProvider.GetService<ExampleService>();
    Assert.NotEqual(localScopedV1, globalScoped);
    Assert.NotEqual(localScopedV2, globalScoped);
}

Documentation : Durée de vie des services et options d'enregistrement .

Référence Microsoft.Extensions.DependencyInjection ou simplement Microsoft.AspNetCore.All pour utiliser le code ci-dessus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X