无法获取托管服务实例(手动启动托管服务 .net core 3.1)

4

我有一个基于 .NET Core 2.2 的API项目和测试项目。现在我已将这两个项目迁移到 .NET Core 3.1。

在测试项目中,我有一个“Initialize”方法,我在其中手动添加服务。

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);}

在 .net core 2.2 中,上述代码完美运行,但迁移到 .net core 3.1 后,“GetService”方法总是返回“null”。

我尝试了下面问题中接受的答案。 它在 .net core 2.2 中有效,但在 .net core 3.1 中无效。 Integration Test For Hosted Service .Net-Core`

请问有人可以建议我对上述代码进行哪些更改以适用于 .net core 3.1?

1个回答

3

由于服务集合中似乎有多个托管服务,因此解决测试所需的托管服务的方法需要改变。

//...

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

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

//...

使用GetServices<T>(注意复数形式的services)获取所有已注册的托管服务,然后使用LINQ筛选出所需服务。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接