Я использую Razor Components Blazor на стороне сервера ASP.NET Core проекта. У меня есть контроллер, где я получаю HTTP-пост от внешнего сервиса, когда получают новые сообщения. Я хочу, чтобы компоненты бритвы отображали сообщения сразу после их поступления. И я хочу, чтобы несколько компонентов бритвы могли регистрироваться на это событие
Есть ли способ регистрации на событие внутри контроллера из компонента бритвы? Или я должен использовать другие методы, такие как Xamarin Message Center ?
Контроллер:
public class LoRaServerController : ControllerBase
{
public event EventHandler<SensorData>? OnNewSensorData;
// POST: api/LoRaServer
[HttpPost]
public async void PostUplink()
{
if (OnNewSensorData != null)
{
var uplink = await DeserializeBody<Uplink>(Request.Body);
if (uplink != null)
OnNewSensorData(this, new SensorData(uplink));
}
}
private async Task<T?> DeserializeBody<T>(Stream body) where T : class
{
//Json deserialization...
}
}
Компонент бритвы:
@attribute [Authorize(Roles = "Administrator")]
@page "/lora-debug"
@using Xxx.Controller
@using Xxx.Services.Entities
@inject LoRaServerController _ctrl; //this doesn't work as controllers are no services...
@implements IDisposable;
<h3>Sensor Server Debug</h3>
<table class="table">
<thead>
<tr>
<th>Time</th>
<th>EUI</th>
<th>Uptime</th>
<th>Voltage</th>
</tr>
</thead>
<tbody>
@foreach (var msg in sensorData)
{
<tr>
<td>@msg.Timestamp</td>
<td>@msg.DeviceEUI</td>
<td>@msg.Uptime</td>
<td>@msg.Voltage</td>
</tr>
}
</tbody>
</table>
@code {
private List<SensorData> sensorData = new List<SensorData>();
protected override void OnInitialized()
{
_ctrl.OnNewSensorData += Instance_OnNewSensorData;
}
public void Dispose()
{
_ctrl.OnNewSensorData -= Instance_OnNewSensorData;
}
private void Instance_OnNewSensorData(object? sender, SensorData e)
{
sensorData.Add(e);
InvokeAsync(() => this.StateHasChanged());
}
}