在我的Asp.Net Core应用程序中,我通过SignalR Core从.Net客户端接收更新。通过这些更新,我尝试了解.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");
}
}
在上面的代码示例中,您可以看到我要完成的工作。我遇到的问题是该事件无法在集线器之外的类中访问,所以我无法使用它。
答案 0 :(得分:0)
将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);
}
}