我想在asp.net core 中使用后臺任務。我找到了有用的檔案https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-6.0&tabs=visual-studio
我想知道為什么他們的生命周期顯然是有范圍的:激活范圍服務的托管服務。范圍服務可以使用依賴注入 (DI)。 在這種情況下,范圍是什么?
對于 Web 應用程式,范圍生命周期表示每個客戶端請求(連接)創建一次服務。使用 AddScoped 注冊范圍服務。在處理請求的應用程式中,作用域服務在請求結束時被釋放。
雖然我確實理解這對于例如對 api 的標準 http get 請求意味著什么,但我不理解后臺作業人員的含義。恕我直言,擁有一個單身背景作業者會更有意義。我當然不想在我的應用程式中同時運行多個實體。
另一件事是后臺作業人員中的 DI,它顯然不同于標準服務: 要在 BackgroundService 中使用范圍服務,請創建一個范圍。默認情況下不會為托管服務創建范圍。
我無法確認:
services.AddHostedService(x => new DataPersister(x.GetRequiredService<IAsyncDocumentSession>(), x.GetRequiredService<ILogger>()));
似乎作業得很好。
uj5u.com熱心網友回復:
您必須在其完整背景關系中閱讀“激活范圍服務的托管服務”這句話:
本文提供了三個托管服務示例:
- 在計時器上運行的后臺任務。
- 激活范圍服務的托管服務。范圍服務可以使用依賴注入 (DI)。
- 按順序運行的排隊后臺任務。
(來自“帶有托管服務的后臺任務”,重點是我的)
因此,托管服務的生命周期并非如此。使用AddHostedService()添加的所有托管服務實際上都添加了單例生命周期,以確保只有一個實體。
本文所指的情況是您需要在托管服務中使用范圍服務(如資料庫連接)。由于您無法將作用域依賴項注入到單例服務中,因此您將需要不同的解決方案。解決方案通常涉及讓單例服務(在本例中為托管服務)創建一個服務范圍本身,然后它可以從中檢索范圍依賴項。
如果您有興趣,我在最近對類似問題的回答中詳細介紹了服務范圍。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/371312.html
