获取托管服务实例失败(手动启动托管服务.net core 3.1)
Failed to get hosted service instance (Manually start hosted service .net core 3.1)
我在 .net core 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 core 2.2 上面的代码运行良好,但是迁移后“GetService”方法总是return“null”。
我已尝试接受以下问题的答案。它在 .net core 2.2 中工作但在 .net core 3.1 中不工作
任何人都可以建议我应该对 .net core 3.1 的上述代码进行哪些更改吗?
由于服务集合中似乎有多个托管服务,因此需要更改为测试解析所需托管服务的方法。
//...
// Hosted Service
IHostedService service = ServiceProvider.GetServices<IHostedService>()
.OfType<QueuedHostedService>().First();
//Act
service.StartAsync(CancellationToken.None);}
//...
使用 GetServices<T>
(注意复数 services) 获取所有已注册的托管服务,并使用 LINQ 过滤掉你要的那个
我在 .net core 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 core 2.2 上面的代码运行良好,但是迁移后“GetService”方法总是return“null”。
我已尝试接受以下问题的答案。它在 .net core 2.2 中工作但在 .net core 3.1 中不工作
任何人都可以建议我应该对 .net core 3.1 的上述代码进行哪些更改吗?
由于服务集合中似乎有多个托管服务,因此需要更改为测试解析所需托管服务的方法。
//...
// Hosted Service
IHostedService service = ServiceProvider.GetServices<IHostedService>()
.OfType<QueuedHostedService>().First();
//Act
service.StartAsync(CancellationToken.None);}
//...
使用 GetServices<T>
(注意复数 services) 获取所有已注册的托管服务,并使用 LINQ 过滤掉你要的那个