public async Task Invoke(HttpContext context, DataContext dataContext, IIntegrationMessagePublisher integrationMessagePublisher)
        {
            IDbContextTransaction dbContextTransaction = await dataContext.Database.BeginTransactionAsync(IsolationLevel.ReadCommitted);

            await _next(context);

            await dbContextTransaction.CommitAsync();

            await integrationMessagePublisher.Publish();
        }
Esempio n. 2
0
        public OrderStateMachine(OrderModel orderModel,
                                 IIntegrationMessagePublisher integrationMessagePublisher,
                                 DataContext dataContext)
        {
            _integrationMessagePublisher = integrationMessagePublisher;

            _orderModel        = orderModel;
            _orderStateMachine = new StateMachine <OrderStates, OrderActions>((OrderStates)_orderModel.OrderState);

            _changePaymentStatusTrigger  = _orderStateMachine.SetTriggerParameters <PaymentStatuses>(OrderActions.ChangePaymentStatus);
            _changeShipmentStatusTrigger = _orderStateMachine.SetTriggerParameters <ShipmentStatuses>(OrderActions.ChangeShipmentStatus);

            _orderStateMachine.Configure(OrderStates.Initial)
            .Permit(OrderActions.Submit, OrderStates.Submitted);

            _orderStateMachine.Configure(OrderStates.Submitted)
            .OnEntry(OnSubmitted)
            .Permit(OrderActions.SetAsPaymentStarted, OrderStates.PaymentProcessStarted);

            _orderStateMachine.Configure(OrderStates.PaymentProcessStarted)
            .PermitDynamic(_changePaymentStatusTrigger, SetPaymentStatus);

            _orderStateMachine.Configure(OrderStates.PaymentCompleted)
            .OnEntry(OnPaymentCompleted)
            .Permit(OrderActions.SetAsOrderShipped, OrderStates.OrderShipped);

            _orderStateMachine.Configure(OrderStates.PaymentFailed)
            .OnEntry(OnPaymentFailed)
            .Permit(OrderActions.SetAsOrderClosed, OrderStates.OrderClosed);

            _orderStateMachine.Configure(OrderStates.OrderShipped)
            .PermitDynamic(_changeShipmentStatusTrigger, SetShipmentStatus);

            _orderStateMachine.Configure(OrderStates.ShipmentDelivered)
            .OnEntry(OnShipmentDelivered)
            .Permit(OrderActions.SetAsOrderCompleted, OrderStates.OrderCompleted);

            _orderStateMachine.Configure(OrderStates.ShipmentReturned)
            .OnEntry(OnShipmentReturned)
            .Permit(OrderActions.SetAsRefundStarted, OrderStates.RefundStarted);

            _orderStateMachine.Configure(OrderStates.RefundStarted)
            .Permit(OrderActions.SetAsRefundCompleted, OrderStates.RefundCompleted);

            _orderStateMachine.Configure(OrderStates.RefundCompleted)
            .OnEntry(OnRefundCompleted)
            .Permit(OrderActions.SetAsOrderClosed, OrderStates.OrderClosed);

            _orderStateMachine.OnTransitioned(transition =>
            {
                _orderModel.SetState((int)transition.Destination);
                dataContext.SaveChanges();
            });
            _orderStateMachine.OnUnhandledTrigger((states, actions) => throw new InvalidStatusTransitionException(states.ToString(), actions.ToString()));
        }
 public OrderStateMachineFactory(DataContext dataContext, IIntegrationMessagePublisher integrationMessagePublisher)
 {
     _dataContext = dataContext;
     _integrationMessagePublisher = integrationMessagePublisher;
 }