簡體   English   中英

如何使持久性后台任務在 asp.net 核心中發出作用域服務信號?

[英]How to make a persistent background task signal a scoped service in asp.net core?

在我的 ASP.NET Core 2.2 Web 應用程序中,我的 Startup.ConfigureServices(IServiceCollection services) 方法中有這些范圍服務:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDirectoryBrowser();

    services.AddScoped<WebApplication.Services.DoThingAlpha>();
    services.AddScoped<WebApplication.Services.DoThingBravo>();
    services.AddScoped<WebApplication.Services.DoThingCharlie>();

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

這些范圍服務為我的控制器做臟活。

但是,我需要在后台不斷偵聽 UDP 端口,然后在偵聽器上收到某些 UDP 消息時通知相應的服務(DoThingsAlpha、DoThingsBravo 或 DoThingsCharlie)。

我想我可以用 BackgroundService 實現后台服務( https://docs.microsoft.com/en-us/dotnet/standard/microservices-architecture/multi-container-microservice-net-applications/background-tasks-with-ihostedservice ),然后添加到 ConfigureServices 中的服務集合。 讓我們稱之為 ListenOnUDP :BackgroundService

問題是,我如何向那些其他作用域服務發出信號,表明在 ListenOnUDP 中收到了 UDP 消息? 解決此類問題的推薦模式是什么? 肯定有一個。

我已經找到了一個解決方案,我認為問題源於我對 ASP.NET Core 服務的根本缺乏了解。 如果有人有同樣的問題(或者可能驗證或使我的答案無效),我會解釋。

當您向 IServiceCollection 添加服務類/接口時,其他服務可以通過該接口訪問該服務。 您只需將接口包含在您要在構造函數中調用的其他服務的構造函數中,保存它,然后您就可以調用該接口(我理解的是依賴注入的一種表現)。 像這樣:

    private readonly InterfaceRCResponseQueue _rcResponseQueue;
    private readonly ILogger _logger;

    public UdpListenerBackgroundService(
        InterfaceRCResponseQueue rcResponseQueue,
        ILogger<UdpListenerBackgroundService> logger
        )
    {
        _rcResponseQueue = rcResponseQueue;
        _logger = logger;
    }

這通過調用接口上的方法有效地讓一個服務向另一個服務發出信號。

捕獲:

單例服務不能依賴於作用域或瞬態服務。 大概是因為它掛斷了作用域或瞬態服務。 不過反過來也可以。

https://blog.markvincze.com/two-gotchas-with-scoped-and-singleton-dependencies-in-asp-net-core/

就我而言,我有一個 UdpClient 類,它需要偵聽消息然后向其他服務發送信號。

為此,我將我的 UdpClient 類放在從 Microsoft.Extensions.Hosting.BackgroundService 繼承的類中,因此隨着應用程序的生命周期被創建和拆除。 我還創建了一個包含隊列的單例類。

當我的 BackgroundService 類中的 UdpClient 類獲取 UDP 數據報時,我調用單例類上的一個方法,將它排入單例類的隊列中。

然后,作用域、單例或瞬態類可以依賴於單例類並在空閑時在該隊列(出隊)中查找數據。 你不能做相反的事情(使單例依賴於作用域或傳遞服務)。

這是我想出的信號形式,從單例或后台服務間接通知較小的服務。

暫無
暫無

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

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