public static void UseMvc(
            this IPipelineBuilder @this,
            Action <IUseMvcBuilder> configureUseMvcBuilder = null)
        {
            var addMvcBuilder = @this.ServiceProvider.GetRequiredService <IAddMvcBuilder>();
            var options       = addMvcBuilder.MvcOptions;
            var useMvcBuilder = new UseMvcBuilder(@this.ServiceProvider);

            useMvcBuilder.Controllers = addMvcBuilder.Controllers;
            //Controllers settiongs.
            ControllersMiddlewareExtensions.InitUseMvcBuilder(useMvcBuilder);

            //Custom settings.
            //!Warning! Service bus will always return null values before we init MvcMiddleware.
            configureUseMvcBuilder?.Invoke(useMvcBuilder);

            var md = new MvcMiddleware(addMvcBuilder.MvcOptions, useMvcBuilder);

            //Add BotExt validator.
            if (options.ConfigureBotExtWithMvc)
            {
                @this.AddBotExtMvcGlobalValidator(
                    options.BotExtOrder,
                    md.SetGlobalSearchBag
                    );
            }

            @this.UseMiddleware(md);
        }
        public static void AddMvc(
            this ServiceCollectionWrapper serviceCollectionWrapper,
            MvcOptions mvcOptions = null,
            Action <IAddMvcBuilder> configureAddMvcBuilder = null)
        {
            var serv = serviceCollectionWrapper.Services;

            //First step. Register all services, that can be registered before IAddMvcBuilder configurations.
            AddServises_NotRequiredBuilder(serviceCollectionWrapper);

            //Second step. Init AddMvcBuilder parameters with MvcOptions to pass it to callback.
            mvcOptions = mvcOptions ?? new MvcOptions();
            var addMvcBuilder = InitAddMvcBuilder(serviceCollectionWrapper, mvcOptions);

            //Third step. Register all services based on IAddMvcBuilder.
            AddServises_RequiredBuilder(
                serviceCollectionWrapper,
                addMvcBuilder
                );

            //!Add controllers services.
            ControllersMiddlewareExtensions.AddControllersServices(addMvcBuilder);

            //Custom configs.
            configureAddMvcBuilder?.Invoke(addMvcBuilder);

            //Finish. Register builders to be resolved in middleware.
            serv.AddSingleton <IAddMvcBuilder>(addMvcBuilder);
        }
        static IAddMvcBuilder InitAddMvcBuilder(ServiceCollectionWrapper serviceCollectionWrapper, MvcOptions mvcOptions)
        {
            var            serv          = serviceCollectionWrapper.Services;
            IAddMvcBuilder addMvcBuilder = new AddMvcBuilder(
                mvcOptions,
                serv
                );

            ControllersMiddlewareExtensions.InitAddMvcBuilder(mvcOptions, addMvcBuilder);
            return(addMvcBuilder);
        }