C# 在集线器或控制器中实现CRUD方法的信号器
我有一个基于ASP.NET MVC应用程序的Angular应用程序,还有一个仪表板,其中显示了在创建/更新/删除事件中更改的一些平均数和总数。通常,这些事件在控制器中实现,如下所示: Controller.cs: 但是,在每次执行这些方法之后,我需要调用相应的Hub方法来更新仪表板页面上的数字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]
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)我忘记了。非常感谢您的帮助。我将尝试采用这种方法,并通知您,除此之外,还将标记为回答此问题。现在当然投票支持x2;)亲爱的贝尼亚明,非常感谢你的帮助。现在我正在改进我在集线器和控制器方面的代码,并考虑使用上面的方法来实现这一点。那里没有DI,但我不确定这段代码与您的Hub&Controller代码之间的区别是什么?我知道,这段代码不使用DI,而是使用静态方法并简单地调用它。有什么优点和缺点吗?有什么帮助吗?使用DI,您可以轻松测试代码(轻松模拟所有依赖项并为控制器中的方法创建单元测试)。如果在方法中使用静态对象,则不可能创建单元测试(不能模拟静态类)。
[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);
}
}