gpt4 book ai didi

c# - 如何使持久的后台任务在 asp.net core 中发出范围内的服务信号?

转载 作者:行者123 更新时间:2023-11-30 16:38:26 24 4
gpt4 key购买 nike

在我的 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);
}

这些范围内的服务为我的 Controller 做脏活。

但是,我需要在后台不断地监听 UDP 端口,然后在监听器上收到某些 UDP 消息时通知相应的服务(DoThingsAlpha、DoThingsBravo 或 DoThingsCharlie)。

我想我可以用 BackgroundService ( https://learn.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 服务根本缺乏理解。如果有人有同样的问题(或者可能验证或无效我的答案),我会解释。

当您将服务类/接口(interface)添加到 IServiceCollection 时,其他服务可以通过该接口(interface)访问该服务。您只需将接口(interface)包含在您要在构造函数中调用的其他服务的构造函数中,保存它,然后您就可以调用该接口(interface)(我理解的是依赖注入(inject)的表现)。像这样:

    private readonly InterfaceRCResponseQueue _rcResponseQueue;
private readonly ILogger _logger;

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

这有效地让一个服务通过调用接口(interface)上的方法向另一个服务发送信号。

收获:

单例服务不能依赖于作用域或 transient 服务。大概是因为它挂断了作用域或 transient 服务。反之亦然。

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

在我的例子中,我有一个 UdpClient 类需要监听消息然后向其他服务发送信号。

为此,我将我的 UdpClient 类放在继承自 Microsoft.Extensions.Hosting.BackgroundService 的类中,因此随着应用程序的生命周期而创建和拆除。我还创建了一个包含队列的单例类。

当我的 BackgroundService 类中的 UdpClient 类获取 UDP 数据报时,我调用单例类上的一个方法,将其排入单例类的队列中。

作用域、单例或 transient 类然后可以依赖于单例类并在空闲时在该队列中查找数据(出队)。你不能做相反的事情(使单例依赖于作用域或传递服务)。

这是我想出的信号形式,用于从单例或后台服务间接通知较小的服务。

关于c# - 如何使持久的后台任务在 asp.net core 中发出范围内的服务信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54949292/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com