private GenericResult HandleTradeCommand( OrderStateMachine.Trigger trigger, ITriggerContext context, ITrade trade, ITradeEditableData editableData = null ) { Contract.Requires(context != null, "context != null"); _workingData = CurrentData.Clone(); if (!_stateMachine.CanFireTrigger(trigger)) { return(GenericResult.FailureFormat(String.Format("The commmand {0} is not allowed when the _order is in {1} state", trigger, OrderState))); } GenericResult result; switch (trigger) { case OrderStateMachine.Trigger.AddTrade: trade = new Trade { Order = this }; result = trade.Create(context, editableData); break; case OrderStateMachine.Trigger.TradeBooked: //TODO handle the booking done result = GenericResult.Success(); break; case OrderStateMachine.Trigger.CancelTrade: result = trade.Cancel(context); break; case OrderStateMachine.Trigger.UpdateTrade: default: return(GenericResult.FailureFormat("The trade command {0} is not implemented", trigger)); } return(result.IsSuccess() ? HandleCommand(trigger, context, dealingData: new OrderDealingEventParameter(trade)) : result); }