Example #1
0
        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);
        }
Example #2
0
        /// <summary>
        /// Вызывает соответствующий метод с конечным результатом.
        /// </summary>
        private void Invoke(Type lastOperation, StepParameters parameters)

        {
            if (_actions.ContainsKey(lastOperation))
            {
                _actions[lastOperation].DynamicInvoke(parameters);
            }
        }
Example #3
0
        /// <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);
        }