Внедрение основного концентратора SignalR Asp

#asp.net-core #signalr

#asp.net-core #signalr

Вопрос:

Могу ли я внедрить концентратор SignalR (ChatHub является производным от Hub) в службу, выполнив следующее:

в Startup.cs:

services.AddSingleton<ChatHub>();

Для внедрения в другой сервис:

     public AnotherClass(ChatHub chatHub)(....

... chatHub.CallMethod(...
  

Это работает, но это хорошая идея?
Я всегда нахожу IHubContext для этой цели, но почему я должен их использовать?

Комментарии:

1. Нет, вы не можете. Используйте IHubContext . learn.microsoft.com/aspnet/core/signalr /…

2. Спасибо за комментарий. Вы знаете почему? Потому что я могу зарегистрировать концентратор как одноэлементный, чтобы внедрить его, и он работает

Ответ №1:

SignalR ожидает, что концентратор будет создан отдельно для каждого сообщения. Вам нужно добавить его в качестве временной службы, если вы хотите, чтобы ваш концентратор был в DI. Обычно вы не должны разрешать концентратор из DI. Если вам нужно разделить код между вашим концентратором и каким-либо другим компонентом, я бы предложил использовать либо IHubContext, либо поместить общий код в отдельную службу DI.

 private IHubContext<ChatHub, IChatHub> ChatHub
{
    get
    {
        return this.serviceProvider.GetRequiredService<IHubContext<ChatHub, IChatHub>>();
    }
}