public abstract object Invoke(object instance, IServiceProvider serviceProvider, OverrideArguments args);
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>()); }
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)); }