Ejemplo n.º 1
0
        public ActionResult Execute(string workflowKey, string activityKey, Type modelType, string methodName, int index)
        {
            var activity = GetActivityFor(workflowKey, activityKey);

            if (activity == null)
            {
                throw new Exception("Workflow does not contains a start activity.");
            }

            var activityMethod = activity.Method;
            var type           = activityMethod.DeclaringType;

            var mapping = GetMappingFor(type, activityMethod, methodName, index);

            if (mapping == null)
            {
                throw new RunningObjectsException(string.Format("No method found with name {1} for type {0}", type.PartialName(), activityMethod.Name));
            }

            var bindingContext = MethodBinder.CreateBindingContext(ControllerContext);

            ((ValueProviderCollection)bindingContext.ValueProvider).Add(new WorkflowBindingParameterValueProvider());

            var method = Binders[typeof(Method)].BindModel(ControllerContext, bindingContext) as Method;

            if (method != null)
            {
                if (!method.Parameters.Any() || method.Descriptor.Attributes.OfType <AutoInvokeAttribute>().Any())
                {
                    return(ExecuteMethodOf
                           (
                               modelType,
                               method,
                               OnSuccess(activity, null),
                               OnSuccessWithReturn(activity),
                               OnException(method),
                               HttpNotFound
                           ));
                }
            }
            return(!ControllerContext.IsChildAction ? (ActionResult)View("Execute", method) : PartialView("Execute", method));
        }
Ejemplo n.º 2
0
        public ActionResult Execute(Type modelType, string methodName, int index, string key = null)
        {
            var typeMapping = ModelMappingManager.MappingFor(modelType);
            var methods     = key != null ? typeMapping.InstanceMethods : typeMapping.StaticMethods;
            var mapping     = methods.FirstOrDefault(m => m.MethodName.Equals(methodName, StringComparison.InvariantCultureIgnoreCase) && m.Index == index);

            if (mapping == null)
            {
                throw new RunningObjectsException(string.Format("No method found with name {2} at index {0} for type {1}", index, modelType.PartialName(), methodName));
            }

            var method = Binders[typeof(Method)].BindModel(ControllerContext, MethodBinder.CreateBindingContext(ControllerContext)) as Method;

            if (method != null)
            {
                if (!method.Parameters.Any() || method.Descriptor.Attributes.OfType <AutoInvokeAttribute>().Any())
                {
                    return(ExecuteMethodOf
                           (
                               modelType,
                               method,
                               () => OnSuccess(modelType)(null),
                               OnSuccessWithReturn(method),
                               OnException(method),
                               HttpNotFound,
                               key
                           ));
                }

                if (!method.Descriptor.Mapping.Method.IsStatic)
                {
                    method.Instance = GetInstanceOf(modelType, key, new ModelDescriptor(typeMapping));
                    RunningObjectsSetup.Configuration.Query.RemoveKeywordEvaluator("{instance}");
                    RunningObjectsSetup.Configuration.Query.KeywordEvaluators.Add("{instance}", q => method.Instance);
                }
            }
            return(!IsChildAction ? (ActionResult)View(method) : PartialView(method));
        }