【问题标题】:Recommended lifecycle for services using SignalR hubs使用 SignalR 集线器的服务的推荐生命周期
【发布时间】:2020-04-09 08:44:31
【问题描述】:

我在 ASP.NET Core Web 应用程序(在 .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);
    }
}

【问题讨论】:

    标签: asp.net-core signalr asp.net-core-signalr


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】: