public static async Task Handler(ControllerActionContext controllerActionContext) { var serv = controllerActionContext.UpdateContext.Services; var factory = serv.GetRequiredService <IControllersFactory>(); BotController controller = factory.Create(controllerActionContext); //Invoke initializer. await BotController.InvokeInitialize(controller, controllerActionContext); var methodInfo = controllerActionContext.ActionDescriptor.MethodInfo; //Model binding. var modelBindingContext = new ModelBindingContext(controllerActionContext); var mainModelBinder = serv .GetRequiredService <IMainModelBinderProvider>().MainModelBinder; await mainModelBinder.Bind(modelBindingContext); controllerActionContext.IsModelStateValid = modelBindingContext.IsAllBinded(); var invokationParams = modelBindingContext.ToMethodParameters(); //Invoke. var methodResult = methodInfo.Invoke(controller, invokationParams); if (methodResult is Task task) { await task; } //Invoke finished. await BotController.InvokeProcessed(controller); }
/// <summary> /// Use only IOC container to resolve controllers. /// </summary> public BotController Create(ControllerActionContext controllerActionContext) { var serv = controllerActionContext.UpdateContext.Services; var type = controllerActionContext.ActionDescriptor.ControllerType; var controller = (BotController)serv.GetService(type); return(controller); }
public ModelBindingContext(ControllerActionContext controllerContext) { ControllerContext = controllerContext ?? throw new ArgumentNullException(nameof(controllerContext)); foreach (var param in Parameters) { _dataByParamName[param.Name] = new ModelBindingParameterData() { Info = param }; } }