public async Task <int> RunCommand( CommandInfo commandInfo, List <ArgumentInfo> parameterValues) { parameterValues = parameterValues ?? new List <ArgumentInfo>(); //get values for method invocation object[] mergedParameters = _argumentMerger.Merge(parameterValues); //validate all parameters foreach (dynamic param in mergedParameters) { _modelValidator.ValidateModel(param); } //create instance object instance = _appInstanceCreator.CreateInstance(_type, _constructorParamValues, _dependencyResolver, _modelValidator); CommandInvocation commandInvocation = new CommandInvocation { CommandInfo = commandInfo, ParamsForCommandMethod = mergedParameters, Instance = instance, ArgsFromCli = parameterValues }; object returnedObject = _appSettings.CommandInvoker.Invoke(commandInvocation); //disposing -- switch (instance) { case IDisposable disposable: disposable.Dispose(); break; } //disposing -- //default return code for cases when method is of type void instead of int int returnCode = 0; //wait for method to complete switch (returnedObject) { case Task <int> intPromise: returnCode = await intPromise; break; case Task promise: await promise; break; case int intValue: returnCode = intValue; break; //for void and every other return type, the value is already set to 0 } //return the actual return code return(returnCode); }
public async Task <int> RunCommand( CommandInfo commandInfo, List <ArgumentInfo> parameterValues) { parameterValues = parameterValues ?? new List <ArgumentInfo>(); //create instance object instance = _appInstanceCreator.CreateInstance(_type, _constrcutorParamValues, _dependencyResolver, _modelValidator); //dentify method to invove MethodInfo theMethod = instance.GetType().GetMethod(commandInfo.MethodName); //get values for method invokation object[] mergedParameters = _argumentMerger.Merge(parameterValues); //validate all parameters foreach (dynamic param in mergedParameters) { _modelValidator.ValidateModel(param); } //invoke method object returnedObject = theMethod.Invoke(instance, mergedParameters); //default return code for cases when method is of type void instead of int int returnCode = 0; //wait for method to complete switch (returnedObject) { case Task <int> intPromise: returnCode = await intPromise; break; case Task promise: await promise; break; case int intValue: returnCode = intValue; break; //for void and every other return type, the value is already set to 0 } //return the actual return code return(returnCode); }
public object CreateInstance( Type type, IEnumerable <ArgumentInfo> constructionParams, IDependencyResolver dependencyResolver, ModelValidator modelValidator) { constructionParams = constructionParams ?? new List <ArgumentInfo>(); //create instance object[] mergedValues = _argumentMerger.Merge(constructionParams); //validate all parameters foreach (dynamic param in mergedValues) { modelValidator.ValidateModel(param); } object instance = Activator.CreateInstance(type, mergedValues); //detect injection properties List <PropertyInfo> properties = type.GetDeclaredProperties <InjectPropertyAttribute>().ToList(); if (properties.Any()) { if (dependencyResolver != null) { foreach (var propertyInfo in properties) { propertyInfo.SetValue(instance, dependencyResolver.Resolve(propertyInfo.PropertyType)); } } else // there are some properties but there is no dependency resolver set { throw new AppRunnerException("Dependency resolver is not set for injecting properties. " + "Please use an IoC framework'"); } } return(instance); }