SignalR реализует методы CRUD в Hub или Controller - PullRequest
1 голос
/ 10 июля 2019

У меня есть приложение Angular, основанное на приложении ASP.NET MVC, и есть панель инструментов, где я отображаю некоторые из средних и общих чисел, которые изменяются в событиях Create / Update / Delete.Обычно эти события реализуются в контроллере, как показано ниже:

Controller.cs:

[HttpPost]
public JsonResult Create(Record record)
{
    // code omitted for brevity
    return Json(new { Data = data, success = true }, JsonRequestBehavior.AllowGet);
}

[HttpPost]
public JsonResult Update(Record record)
{
    // code omitted for brevity
    return Json(new { Data = data, success = true }, JsonRequestBehavior.AllowGet);
}

[HttpPost]
public JsonResult Delete(int id)
{
    // code omitted for brevity
    return Json(new { Data = data, success = true }, JsonRequestBehavior.AllowGet);
}

Однако после каждого выполненияэти методы, мне нужно вызвать соответствующие методы Hub для обновления номеров на странице Dashboard.

Hub.cs:

public class NotificationHub : Hub
{
    public void Update(Record record)
    {
        Clients.All.updateStatisticsToPage(record);
    }
}

Итак, мои вопросы:

1) Как я могу объединить эти методы для обновления номеров на странице панели инструментов?Должен ли я переместить методы CRUD в Hub и использовать только эти методы?Я добавил последнюю строку, чтобы уведомить клиентов о текущих статистических данных.

[HttpPost]
public JsonResult Create(Record record)
{
    // code omitted for brevity
    return Json(new { Data = data, success = true }, JsonRequestBehavior.AllowGet);

    // send update to all clients
    Clients.All.updateStatisticsToPage(record);
}

Или я должен сохранить метод в методе Controller и вызвать метод-концентратор после выполнения операции crud?

2) Когда я обновляю статистику на странице Dashboard после события crud, я думаю, что создаю структуру, отличную от приложения чата.Потому что я отправляю уведомление компоненту Dashboard только после события crud.Это правда?

Ответы [ 2 ]

1 голос
/ 10 июля 2019

С другой стороны, есть ли другое умное решение без использования CQRS вместо перемещения методов CRUD в Hub?Поскольку класс Hub не содержит некоторые методы, которые есть в классе Controller, было бы лучше продолжать использовать тот же метод (Create Update Delete) в Controller, добавив Clients.All.updateStatisticsToPage (record);строка после выполнения операции.Возможно ли это и не могли бы вы опубликовать пример?

Я не использовал это таким образом, но я думаю, что это возможно.Вы можете попробовать создать StatisticsHub с интерфейсом IStatisticsHub:

public interface IStatisticsHub
{
    Task Send(string message);
}

public class StatisticHub : Microsoft.AspNetCore.SignalR.Hub, IStatisticsHub
{
    private readonly IHubContext<StatisticHub > _context;

    public StatisticHub(IHubContext<EventTypeHub> context)
    {
        _context = context;
    }

    public async Task Send(string message)
    {
        await _context.Clients.All.SendAsync("Send", message);
    }
}

Теперь вы можете добавить этот концентратор в DI-контейнер как Singleton:

services.AddSingleton<IStatisticsHub, StatisticHub>();

Последний шаг - добавить этот концентратор в вашконтроллер:

public class Controller : ControllerBase
{
    private readonly IStatisticsHub _statisticsHub;

    public Controller(IStatisticsHub statisticsHub)
    {
        _statisticsHub = statisticsHub;
    }

    [HttpPost]
    public JsonResult Update(Record record)
    {
        // code omitted for brevity

        // send message to all clients
        _statisticsHub.Send("Statistics");

        return Json(new { Data = data, success = true }, JsonRequestBehavior.AllowGet);
    } 
}

Он должен работать таким образом.

Прежде всего, веб-интерфейс должен создать соединение WebSocket с этим концентратором для получения всех сообщений, но я полагаю, что вы ужезнать это.

1 голос
/ 10 июля 2019

Если вы хотите использовать SignalR, я рекомендую использовать шаблон архитектуры CQRS.Это решит ваши проблемы.В вертикально нарезанной архитектуре вы увидите, где будет лучшее место для отправки уведомлений всем клиентам.

1) Если вы хотите простое, но вонючее решение, сделайте это так.Но я рекомендую использовать CQRS.2) да :)

...