예제 #1
0
        protected async Task <object> DependenciesInvoke(IInvokerMember member, IInvokerMember[] dependencies, object request)
        {
            var tasks = new List <Task <object> >();

            foreach (var dependency in dependencies)
            {
                tasks.Add(this.RecursiveInvoke(dependency, request));
            }

            var result = await Task.WhenAll(tasks);

            if (result.FirstOrDefault(x => (x as ITask)?.AsTask()?.IsFaulted == true) is ITask task)
            {
                throw task.AsTask().Exception;
            }

            return(result.LastOrDefault());
        }
예제 #2
0
        protected async Task <object> RecursiveInvoke(IInvokerMember member, object request)
        {
            var memberType   = member.GetType();
            var result       = null as object;
            var dependencies = member.Dependencies;

            if (member is IInvokerRepeatingMember)
            {
                var loopConditional = await this.InvokeMember(member, request) as ITask <bool>;

                while (await loopConditional)
                {
                    result = await this.DependenciesInvoke(member, dependencies, request);

                    loopConditional = await this.InvokeMember(member, request) as ITask <bool>;
                }

                return(result);
            }
            if (member is IInvokerConditionalMember)
            {
                var conditional = await this.InvokeMember(member, request) as ITask <bool>;

                if (await conditional)
                {
                    return(await this.DependenciesInvoke(member, dependencies, request));
                }
                else
                {
                    return(request);
                }
            }

            result = await this.InvokeMember(member, request);

            if (dependencies == null || dependencies.Count() == 0)
            {
                return(result);
            }

            return(await this.DependenciesInvoke(member, dependencies, result));
        }
 public Invoker(IInvokerMember root) : base(root)
 {
 }
예제 #4
0
 protected async Task <object> InvokeMember(IInvokerMember member, params object[] parameters)
 {
     return(member.Invoke(parameters));
 }
예제 #5
0
 public Invoker(IInvokerMember root)
 {
     this.rootInvokerMember = root;
 }