private async Task <StepResult> ExecuteStep(StepParameters lastParameters, Type operationToExec) { if (!_steps.ContainsKey(operationToExec)) { throw new Exception($"Операция {operationToExec} не зарегистрированна"); } var step = _steps[operationToExec]; StepParameters newParameters; var stepParametersType = step.GetParametersType(); var lastParametersType = lastParameters.GetType(); if (lastParametersType == stepParametersType) { newParameters = lastParameters; } else { newParameters = (StepParameters)_mapper.Map(lastParameters, lastParametersType, stepParametersType); } var methodInfo = step.GetType().GetMethod("Execute"); var methodResult = (Task <StepResult>)methodInfo.Invoke(step, new [] { newParameters }); var result = await methodResult; result.LastParameters = newParameters; return(result); }
/// <summary> /// Вызывает соответствующий метод с конечным результатом. /// </summary> private void Invoke(Type lastOperation, StepParameters parameters) { if (_actions.ContainsKey(lastOperation)) { _actions[lastOperation].DynamicInvoke(parameters); } }
/// <summary> /// Стартует рабочий поток на испольнение. /// </summary> /// <param name="parameters">Параметры запуска первого шага.</param> /// <returns>Завершающий шаг.</returns> public async Task <WorkflowResult> Start <TParameters>(TParameters parameters) { if (_registrator == null || _registrator.IsEmpty()) { throw new Exception("Необходимо инициализировать шаги"); } bool isFinish = false; Type lastOperation = _registrator.MoveFirst(); var step = _steps[lastOperation]; StepParameters lastParameters = (StepParameters)_mapper.Map(parameters, parameters.GetType(), step.GetParametersType()); do { var internalIsFinish = _registrator.IsFinish(); lastOperation = _registrator.GetNext(); var result = await ExecuteStep(lastParameters, lastOperation); if (result.Direction == StepDirection.Finish) { isFinish = true; } else if (result.Direction == StepDirection.ToStep) { _registrator.MoveTo(result.ToStep); } else if (result.Direction == StepDirection.ToStepAndFinish) { isFinish = true; lastOperation = result.ToStep; result = await ExecuteStep(result.LastParameters, result.ToStep); } else if (result.Direction == StepDirection.Next) { if (internalIsFinish) { isFinish = true; } } lastParameters = result.LastParameters; } while (!isFinish); WorkflowResult workflow = new WorkflowResult(); workflow.Parameters = lastParameters; workflow.LastOperation = lastOperation; Invoke(lastOperation, lastParameters); return(workflow); }