C# 在集线器或控制器中实现CRUD方法的信号器

C# 在集线器或控制器中实现CRUD方法的信号器,c#,asp.net,asp.net-mvc,angular,signalr,C#,Asp.net,Asp.net Mvc,Angular,Signalr,我有一个基于ASP.NET MVC应用程序的Angular应用程序,还有一个仪表板,其中显示了在创建/更新/删除事件中更改的一些平均数和总数。通常,这些事件在控制器中实现,如下所示: Controller.cs: 但是,在每次执行这些方法之后,我需要调用相应的Hub方法来更新仪表板页面上的数字 Hub.cs: 因此,我的问题是: 1)如何组合这些方法来更新仪表板页面上的数字?我是否应该将CRUD方法移动到中心,并仅使用这样的方法?我添加最后一行是为了通知客户当前的统计数据 [HttpPost]

我有一个基于ASP.NET MVC应用程序的Angular应用程序,还有一个仪表板,其中显示了在创建/更新/删除事件中更改的一些平均数和总数。通常,这些事件在控制器中实现,如下所示:

Controller.cs:

但是,在每次执行这些方法之后,我需要调用相应的Hub方法来更新仪表板页面上的数字


Hub.cs:

因此,我的问题是:

1)如何组合这些方法来更新仪表板页面上的数字?我是否应该将CRUD方法移动到中心,并仅使用这样的方法?我添加最后一行是为了通知客户当前的统计数据

[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);
}
或者我应该在执行crud操作后将该方法保留在Controller方法和call hub方法中吗


2)当我在crud事件后更新仪表板页面上的统计信息时,我认为我构建的结构与聊天应用程序不同。因为我只在crud事件后向仪表板组件发送通知。这是真的吗

如果您想使用信号器,我建议您使用CQRS体系结构模式。它会解决你的问题。在垂直切片架构中,您将看到哪里是向所有客户端发送通知的最佳位置

1) 如果你想要一个简单但有气味的解决方案,那么就这样做。但我建议使用CQR。 2) 是:)


另一方面,是否有另一个不使用CQR而不是将CRUD方法移动到中心的智能解决方案?因为集线器类不包含控制器类具有的某些方法,所以最好通过添加Clients.All.updateStatisticsToPage(record)继续在控制器中使用相同的方法(Create-Update-Delete);执行操作后的第行。有可能吗?你能举个例子吗

我没有这样使用它,但我认为这是可能的。您可以尝试使用IStatisticsHub界面创建StatisticsHub:

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);
    }
}
它应该是这样工作的


首先,前端必须创建一个与该中心的WebSocket连接来接收所有消息,但我相信您已经知道了。

这些有用的信息非常有用。我看了一下CQR,但目前我们无法切换到使用它,因为有几个人在这个项目上工作。另一方面,是否有另一个不使用CQR而不是将CRUD方法移动到中心的智能解决方案?因为集线器类不包含控制器类具有的某些方法,所以最好通过添加
Clients.All.updateStatisticsToPage(record)继续在控制器中使用相同的方法(创建更新删除)行。有可能吗?你能举个例子吗?当我创建一个记录时,通常我会通过实体框架检索最后添加的记录来返回它。另一方面,我使用数据库视图来更新我的仪表板。因此,我可以修改我的更新视图并在其中包含统计数据,这样我就可以同时将上次添加的+统计数据返回到相关页面。是的,我想到了一个像您描述的解决方案。是的,我认为这是最好的方法-对
客户端进行异步调用。All.updateStatisticsToPage(record)[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);
}
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);
    }
}
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);
    } 
}