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



我在.net核心2.2中有api项目和测试项目。现在我已经在.net core 3.1 中迁移了两个项目

在测试项目中;初始化";我手动添加服务的方法

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核心2.2以上的代码运行得很好,但经过迁移后;GetService";方法总是返回";空";。

我试着接受了以下问题的答案。它在.net核心2.2中工作,但在.net核心3.1中不工作托管服务.Net核心的集成测试`

有人能建议我在上面的代码中对.net核心3.1做什么修改吗?

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

//...
// Hosted Service
IHostedService service = ServiceProvider.GetServices<IHostedService>()
.OfType<QueuedHostedService>().First();
//Act
service.StartAsync(CancellationToken.None);}
//...

使用GetServices<T>(注意复数服务(获取所有注册的托管服务,并使用LINQ筛选出您想要的服务。

最新更新