Есть ли способ реализовать события в SignalR Core Hub? - PullRequest
1 голос
/ 18 марта 2019

В моем приложении Asp.Net Core я получаю обновления от клиента .Net через SignalR Core. С помощью этих обновлений я пытаюсь узнать состояние фоновой службы, работающей на клиенте .Net. Некоторые примеры:

  • «Таймер успешно запущен.»

  • «Таймер успешно приостановлен.»

  • «Таймер успешно восстановлен.»

  • «Таймер не может быть запущен.»

Я хочу использовать эти сообщения в своем приложении Asp.Net Core и перенести их на верхний уровень моего проекта (уровень логики), отправляя события из концентратора (уровень доступа к данным). Кажется, я не могу понять, как это сделать, и не могу найти никакой документации по этой проблеме.

public class TimerHub : Hub
{
    public event EventHandler TimerCouldNotBeStarted;

    // Method called by .Net Client
    Task TimerStatusUpdate(string message)
    {
        switch (message)
        {
            case "Timer could not be started.":
                OnTimerCouldNotBeStarted(EventArgs.Empty); // Raise event
                break;
        }

        return Clients.All.SendAsync("EditionStatusUpdate", message);
    }

    protected virtual void OnTimerCouldNotBeStarted(EventArgs e)
    {
        TimerCouldNotBeStarted?.Invoke(this, e);
    }
}

public class EditionEngine
{
    private readonly IHubContext<TimerHub> _timerHubContext;

    public EditionEngine(IHubContext<TimerHub> hubContext)
    {
        _timerHubContext = hubContext;

        _timerHubContext.TimerCouldNotBeStarted += TimerNotStarted; // Event is not found in the TimerHub
    }

    private static void TimerNotStarted(object sender, EventArgs e)
    {
        Console.WriteLine("Event was raised by Hub");
    }
}

В приведенном выше примере кода вы можете увидеть, что я пытаюсь выполнить. У меня проблема в том, что событие недоступно в классах за пределами хаба, поэтому я не могу его использовать.

1 Ответ

0 голосов
/ 26 марта 2019

Измените ваше TimerCouldNotBeStarted событие на сервис, который вы добавили в DI.Затем разрешите службу в конструкторе Hubs и используйте ее в своих методах.

public class TimerHub : Hub
{
    private readonly TimeService _timer;

    public TimerHub(TimerService timer)
    {
        _timer = timer;
    }

    Task TimerStatusUpdate(string message)
    {
        switch (message)
        {
            case "Timer could not be started.":
                _timer.OnTimerCouldNotBeStarted(EventArgs.Empty); // Raise event
                break;
        }

        return Clients.All.SendAsync("EditionStatusUpdate", message);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...