簡體   English   中英

在依賴注入中注冊多個.Net Core IHostedService - .net 內核中的后台服務

[英]Register multiple .Net Core IHostedService in Dependency Injection - Background service in .net core

我有一個.Net核心(v2.2)API。 那 API 使用了一些外部服務調用。 我們想讓它們像火一樣忘記電話。 我們使用 .net 核心后台服務來實現它。 我們有多個后台服務。 現在,如果我在依賴注入中注冊所有這些 IHostedService,最后注冊的后台服務工作,其他的在項目的構造函數注入中以 null 的形式出現。 注冊依賴項,例如:

services.AddHostedService<BackgroundServiceA>();
 services.AddHostedService<BackgroundServiceB>();

而且,我嘗試將它們添加為:

 services.AddSingleton<IHostedService, BackgroundServiceA>();
 services.AddSingleton<IHostedService, BackgroundServiceB>();

在這兩種情況下,只有 BackgroundServiceB 有效,BackgroundServiceA 在構造函數注入中以 null 的形式出現。

為了解決這個問題,我使用 ServiceProvider 來獲取 object。

  var services = serviceProvider.GetServices<IHostedService>();
 _backgroundServiceA = services.First(o => o.GetType() == typeof(BackgroundServiceA)) as BackgroundServiceA;

這是處理此類問題的好方法,還是我在注冊依賴項時遺漏了一些東西。

另外,我們可以同時觸發兩個后台調用嗎?

(編輯,我最初回答了錯誤的問題......)

依賴注入不適用於同一接口的多個實現。 由於每個托管服務都注冊為IHostedService的實現,因此只有一個服務可以輕松注入其他類型。

但是您可以再次注冊每個服務,使用工廠方法定位后台 singleton 實例;

services.AddHostedService<BackgroundServiceA>();
services.AddHostedService<BackgroundServiceB>();
services.AddSingleton<BackgroundServiceA>(p => p.GetServices<IHostedService>().OfType<BackgroundServiceA>().Single());
services.AddSingleton<BackgroundServiceB>(p => p.GetServices<IHostedService>().OfType<BackgroundServiceB>().Single());

嘗試通過AddHostedService調用在啟動之外的單獨ConfigureServices調用中注冊它們,如文檔中所述:

公共 static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); }

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        })
        .ConfigureServices(services =>
        {
            services.AddHostedService<BackgroundServiceA>();
            services.AddHostedService<BackgroundServiceB>();
        });

避免直接訪問此處討論的托管服務

改用中間服務,如“排隊的后台任務” 示例中所述

暫無
暫無

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

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