#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>>();
}
}