Exemple #1
0
 public abstract object Invoke(object instance, IServiceProvider serviceProvider, OverrideArguments args);
Exemple #2
0
        public object Invoke(IServiceProvider serviceProvider, [NotNull] object instance)
        {
            if (serviceProvider == null)
            {
                throw new ArgumentNullException(nameof(serviceProvider));
            }
            if (instance == null)
            {
                throw new ArgumentNullException(nameof(instance));
            }
            var session = serviceProvider.GetRequiredService <ISession>();

            OverrideArguments GetArguments()
            {
                try
                {
                    var oa = new OverrideArguments();
                    if (this.ParameterConfigurations.Count > 0)
                    {
                        var avs = this.ParameterConfigurations
                                  .Where(z => !z.IsResolveByEngine)
                                  .Select(ArgumentValue.Create)
                                  .ToArray()
                                  .AsReadOnly();
                        serviceProvider.GetRequiredService <IArgumentParser>().Parse(session.Argv, avs);
                        foreach (var item in avs)
                        {
                            oa.AddArgument(item.ParameterName, item.GetValue());
                        }
                    }
                    return(oa);
                }
                catch (ArgumentsException e)
                {
                    serviceProvider.GetRequiredService <IOutputer>().WriteLine(OutputLevel.Error, e.Message);
                    session.DrawUsage();
                    session.Termination();
                    throw;
                }
            }

            var overrideArguments = GetArguments();

            // on interactive mode, arguments cannot
            if (session.ExecuteMode == ExecuteMode.Interactive)
            {
                if (!session.Argv.IsAllUsed())
                {
                    return(session.UnknownArguments <object>());
                }
            }

            object InternalInvoke()
            {
                try
                {
                    return(this.Invoke(instance, serviceProvider, overrideArguments));
                }
                catch (ParameterResolveException)
                {
                    session.DrawUsage();
                    session.Termination();
                    throw;
                }
            }

            var value = InternalInvoke();

            // wait for any kind task
            if (value != null)
            {
                value = serviceProvider.GetValueOrAwaitableResult(value, true);
            }

            object ContinueExecute()
            {
                session.Argv.Grouped();
                var router = CommandRouter.Build(serviceProvider, value);

                return(router.Execute(serviceProvider));
            }

            if (value != null)
            {
                var type          = typeof(TypeConfiguration <>).FastMakeGenericType(value.GetType());
                var configuration = (ITypeConfiguration)serviceProvider.GetRequiredService(type);

                if (!configuration.CanBeResult)
                {
                    return(ContinueExecute());
                }

                if (!session.Argv.IsAllUsed() && configuration.IsDefinedCommand)
                {
                    return(ContinueExecute());
                }
            }

            if (session.Argv.IsAllUsed())
            {
                return(value);
            }

            return(session.UnknownArguments <object>());
        }
Exemple #3
0
        public override object Invoke(object instance, IServiceProvider serviceProvider, OverrideArguments args)
        {
            if (this._invoker == null)
            {
                this._invoker = serviceProvider
                                .GetRequiredService <IMethodInvokerFactory <T> >()
                                .GetInstanceMethodInvoker((MethodInfo)this.Method);
            }

            return(this._invoker.Invoke((T)instance, serviceProvider, args));
        }