Как вы уже опасались, OrderHub
не создается при запуске приложения.Концентратор будет создан, когда клиент подключится или вызовет метод на Концентраторе.Другая проблема заключается в том, что концентратор напрямую удаляется после подключения клиента или вызова метода концентратора.Таким образом, в вашем случае, Hub будет немедленно отписаться от EventHandler.Кроме того, экземпляр Hub не является синглтоном.
Я бы предложил следующее решение, когда вашей основной целью является слабая связь:
Создайте интерфейс IOrderBroadcaster
, чтобы иметь возможность изменять реализациюот SignalR к другой технологии позже:
public interface IOrderBroadcaster
{
Task SendUpdate(string order);
}
Реализация для версии SignalR будет выглядеть так:
public class WebSocketOrderBroadcaster : IOrderBroadcaster
{
private IHubContext<OrderHub> orderHubContext;
public WebSocketOrderBroadcaster(IHubContext<OrderHub> orderHubContext)
{
this.orderHubContext = orderHubContext;
}
public Task SendUpdate(string order)
{
return this.orderHubContext.Clients.All.SendAsync("Update", order);
}
}
Также позаботьтесь, чтобы новый вещатель был зарегистрирован для DI в Startup.cs
:
services.AddSingleton<IOrderBroadcaster, WebSocketOrderBroadcaster>();
Для этого решения ваш Hub
может оставаться пустым:
public class OrderHub : Hub
{
}
В вашем OrderService
вы можете затем добавить IOrderBroadcaster и вызвать свой метод обновления:
public class OrderService : IOrderService
{
private IOrderBroadcaster broadcaster;
public OrderService(IOrderBroadcaster broadcaster)
{
this.broadcaster = broadcaster;
}
public void UpdateOrder(string order)
{
this.broadcaster.SendUpdate(order);
}
}
С этим решением вы добились слабой связи и также не нуждаетесь в EventHandlers, которых, на мой взгляд, следует избегать, если это возможно.
Удачного кодирования!