Razor Component подписывается на событие с контроллера - PullRequest
0 голосов
/ 30 октября 2019

Я использую 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());
    }
}
...