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);
        }
示例#3
0
 public ModelBindingContext(ControllerActionContext controllerContext)
 {
     ControllerContext = controllerContext
                         ?? throw new ArgumentNullException(nameof(controllerContext));
     foreach (var param in Parameters)
     {
         _dataByParamName[param.Name] = new ModelBindingParameterData()
         {
             Info = param
         };
     }
 }