使用 SignalR 中心的服务的推荐生命周期

Recommended lifecycle for services using SignalR hubs

我正在 ASP.NET Core Web 应用程序(运行 on .NET Core 2.2)的各种控制器中使用 SignalR ContentHub 注入以下服务。目前,该服务注入了一个短暂的生命周期。使用单例生命周期会更好吗?在这种情况下,短暂的生命周期是否可能是性能问题的根源?

public class PushMessageService : IPushMessageService
{
    private readonly ILogger<PushMessageService> _logger;
    private readonly IHubContext<ContentHub> _context;

    public PushMessageService(
        ILogger<PushMessageService> logger,
        IHubContext<ContentHub> context
    )
    {
        _logger = logger;
        _context = context;
    }    

    public async Task Push(int productId)
    {
        var msg = new Message
        {
            ProductId = productId
        };

        await SendAsync("PushMsg", productId, msg);
    }

    private async Task SendAsync<TPayload>(string methodName, int productId, TPayload payload)
    {
        await _context.Clients.Group("prod" + productId).SendAsync(methodName, payload);
    }
}

SignalR 期望为每条消息单独创建集线器。如果您希望 Hub 在 DI 中,则需要将其添加为 Transient 服务。您通常不应该从 DI 中解析 Hub。如果您需要在 Hub 和其他组件之间共享代码,我建议您使用 IHubContext 或将共享代码放在单独的 DI 服务中,就像您在此处所做的那样。所以我认为这应该是一个短暂的。

包装集线器的 IHubContext 抽象是单例。因此,使用它作为依赖项的 class 的生命周期并不重要。无论您使用单例、作用域还是瞬态生命周期,您始终会获得相同的实例。