以下是我在signalR
中通过asp.net core web api
实施的订单流程。除了一个场景(下面给出的问题场景)之外,每件事情都运行良好我需要最好的解决方案。
系统概述:
1)客户下新订单(客户等待管理客户处理订单)。
2)订单以“status = unknown”保存到数据库。
3)管理员通过集线器通知新订单。 (在仪表板上)
4)管理员接受或拒绝新订单,然后在数据库中更新订单状态。
5)如果通过SignalR
接受或拒绝,则通知客户该订单问题情景
我们必须实施的业务规则是,如果管理员没有回复,订单应在2分钟后自动拒绝。在这种情况下,服务器应自动拒绝订单,并通知客户。
解决方案1 :我们考虑在客户端和管理端添加计时器,但我们更喜欢Timer位于服务器上的某个位置,因此我们不必在客户端实现计时器和管理员。
基本中心控制器
public abstract class ApiHubController<T> : Controller
where T : Hub
{
private readonly IHubContext _hub;
public IHubConnectionContext<dynamic> Clients { get; private set; }
public IGroupManager Groups { get; private set; }
protected ApiHubController(IConnectionManager signalRConnectionManager)
{
var _hub = signalRConnectionManager.GetHubContext<T>();
Clients = _hub.Clients;
Groups = _hub.Groups;
}
}
public class BaseHubController : ApiHubController<Broadcaster>
{
public BaseHubController(IConnectionManager signalRConnectionManager) : base(signalRConnectionManager)
{
}
}
服务器端代码(下订单)
public class OrderController : BaseHubController
{
public async Task SendNotification([FromBody]NotificationDTO notify)
{
await Clients.Group(notify.AdminId.ToString()).SendNotificationToDashboard(notify); //notifing to admin for about //new order
}
public async Task NotifyDashboard(NotificationDTO model)
{
var sendNotification = SendNotification(model);//sending notification to admin dashboard
}
[HttpPost]
[Route("PlaceOrder")]
public IActionResult PlaceOrder([FromBody]OrderDTO order)//Coustomer place order
{
if (!ModelState.IsValid)
{
return new BadRequestObjectResult(ModelState);
}
var orderCode = _orderProvider.PlaceOrder(order, ValidationContainer);//save new order in database
var notify = order.GetNotificationModel();
notify.OrderId = orderCode;
NotifyDashboard(notify);
//Other code
return new OkObjectResult(new { OrderCode = orderCodeString, OrderId = orderCode });
}
}