簡體   English   中英

獲取托管服務實例失敗(手動啟動托管服務.net core 3.1)

[英]Failed to get hosted service instance (Manually start hosted service .net core 3.1)

我在 .net 核心 2.2 中有 api 項目和測試項目。 現在我已經在 .net 核心 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”方法總是返回“null”。

我已嘗試在以下問題中接受答案。 它在 .net core 2.2 中工作,但在 .net core 3.1 Integration Test For Hosted Service.Net-Core 中不起作用

任何人都可以建議我應該在上面的代碼中為 .net 核心 3.1 做些什么更改?

由於服務集合中似乎有多個托管服務,因此需要更改為測試解析所需托管服務的方法。

//...

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

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

//...

使用GetServices<T> (注意復數services )獲取所有已注冊的托管服務,並使用 LINQ 過濾出您想要的服務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM