4 votes

Impossible d'obtenir l'instance du service hébergé (Démarrage manuel du service hébergé .net core 3.1)

J'avais un projet api et un projet de test en .net core 2.2. Maintenant, j'ai migré les deux projets en .net core 3.1.

Dans le projet de test, j'ai la méthode "Initialize" où j'ajoute les services manuellement.

public void Initalize(){

var services = new ServiceCollection();
services.AddDbContext<DatabaseContext>(opt =>
   opt.UseInMemoryDatabase("EdgePrototype").UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking));
services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
services.AddHostedService<QueuedHostedService>();
services.AddSingleton<IBackgroundTaskQueue, BackgroundTaskQueue>();
services.AddSingleton<TempFileCleanupProvider>();
services.AddSingleton<IHostedService, TempFileCleanupService>();
services.AddSingleton<DbCleanupProvider>();
services.AddSingleton<IHostedService, DbCleanupService>();
services.AddSingleton<IBackgroundTaskQueue, BackgroundTaskQueue>();

ServiceProvider = services.BuildServiceProvider();
ServiceScope = new Mock<IServiceScope>();
ServiceScope.Setup(x => x.ServiceProvider).Returns(ServiceProvider);
ServiceScopeFactory = new Mock<IServiceScopeFactory>();
ServiceScopeFactory
    .Setup(x => x.CreateScope())
    .Returns(ServiceScope.Object);

// Hosted Service
var service = ServiceProvider.GetService<IHostedService>() as QueuedHostedService;
service.StartAsync(CancellationToken.None);}

Dans .net core 2.2 le code ci-dessus fonctionnait parfaitement, mais après la migration la méthode "GetService" retourne toujours "null".

J'ai essayé d'accepter la réponse à la question ci-dessous. Cela fonctionne dans .net core 2.2 mais pas dans .net core 3.1. Test d'intégration pour le service hébergé .Net-Core``

Quelqu'un peut-il me suggérer les changements que je dois faire dans le code ci-dessus pour .net core 3.1 ?

3voto

Nkosi Points 95895

Puisqu'il semble y avoir plusieurs services hébergés dans la collection de services, l'approche pour résoudre le service hébergé souhaité pour le test doit être modifiée.

//...

// Hosted Service
IHostedService service = ServiceProvider.GetServices<IHostedService>()
    .OfType<QueuedHostedService>().First();

//Act
service.StartAsync(CancellationToken.None);}

//...

Utilisez GetServices<T> (notez le pluriel services ) pour obtenir tous les services hébergés enregistrés et, en utilisant LINQ, filtrer celui que vous voulez.

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