订购流程使用SignalR asp.net核心最佳实践

时间:2017-01-26 11:06:05

标签: c# asp.net signalr

以下是我在signalR中通过asp.net core web api实施的订单流程。除了一个场景(下面给出的问题场景)之外,每件事情都运行良好我需要最好的解决方案。

Figure-System Overview

系统概述:

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 });
        }   


    }

0 个答案:

没有答案