// Build the middleware pipeline for the current tenant
        public RequestDelegate BuildTenantPipeline(
            ShellSettings shellSettings,
            HttpContext httpContext)
        {
            var serviceProvider          = httpContext.RequestServices;
            var startUps                 = serviceProvider.GetServices <IStartup>();
            var inlineConstraintResolver = serviceProvider.GetService <IInlineConstraintResolver>();
            var appBuilder               = new ApplicationBuilder(serviceProvider);

            var routePrefix = "";

            if (!string.IsNullOrWhiteSpace(shellSettings.RequestedUrlPrefix))
            {
                routePrefix = shellSettings.RequestedUrlPrefix + "/";
            }

            var routeBuilder = new RouteBuilder(appBuilder)
            {
                DefaultHandler = serviceProvider.GetRequiredService <MvcRouteHandler>()
            };

            // Build prefixed route builder
            var prefixedRouteBuilder = new PrefixedRouteBuilder(
                routePrefix,
                routeBuilder,
                inlineConstraintResolver);

            // Configure modules
            foreach (var startup in startUps)
            {
                startup.Configure(appBuilder, prefixedRouteBuilder, serviceProvider);
            }

            // Add the default template route to each shell
            prefixedRouteBuilder.Routes.Add(new Route(
                                                prefixedRouteBuilder.DefaultHandler,
                                                "PlatoDefault",
                                                "{area:exists}/{controller}/{action}/{id?}",
                                                null,
                                                null,
                                                null,
                                                inlineConstraintResolver)
                                            );

            // Add attribute routing
            routeBuilder.Routes.Insert(0, AttributeRouting.CreateAttributeMegaRoute(serviceProvider));

            // Build router
            var router = prefixedRouteBuilder.Build();

            // Use router
            appBuilder.UseRouter(router);

            // Create a captured HttpContext for use outside of application context
            var capturedHttpContext = serviceProvider.GetService <ICapturedHttpContext>();

            capturedHttpContext.Configure(state => state.Contextualize(httpContext));

            // Create a captured router for use outside of application context
            var capturedRouter = serviceProvider.GetService <ICapturedRouter>();

            capturedRouter.Configure(options =>
            {
                options.Router  = router;
                options.BaseUrl = $"{httpContext.Request.Scheme}://{httpContext.Request.Host}{httpContext.Request.PathBase}";
            });

            // Build & return new pipeline
            var pipeline = appBuilder.Build();

            return(pipeline);
        }
Esempio n. 2
0
        // Build the middleware pipeline for the current tenant
        public RequestDelegate BuildTenantPipeline(
            ShellSettings shellSettings,
            HttpContext httpContext)
        {
            var serviceProvider          = httpContext.RequestServices;
            var startUps                 = serviceProvider.GetServices <IStartup>();
            var inlineConstraintResolver = serviceProvider.GetService <IInlineConstraintResolver>();
            var appBuilder               = new ApplicationBuilder(serviceProvider);

            var routePrefix = "";

            if (!string.IsNullOrWhiteSpace(shellSettings.RequestedUrlPrefix))
            {
                routePrefix = shellSettings.RequestedUrlPrefix + "/";
            }

            var routeBuilder = new RouteBuilder(appBuilder)
            {
                DefaultHandler = serviceProvider.GetRequiredService <MvcRouteHandler>()
            };

            // Build prefixed route builder
            var prefixedRouteBuilder = new PrefixedRouteBuilder(
                routePrefix,
                routeBuilder,
                inlineConstraintResolver);

            // Configure modules
            foreach (var startup in startUps)
            {
                startup.Configure(appBuilder, prefixedRouteBuilder, serviceProvider);
            }

            //// Add the default template route to each shell
            prefixedRouteBuilder.Routes.Add(new Route(
                                                prefixedRouteBuilder.DefaultHandler,
                                                "PlatoDefault",
                                                "{area:exists}/{controller}/{action}/{id?}",
                                                null,
                                                null,
                                                null,
                                                inlineConstraintResolver)
                                            );

            // Add attribute routing
            routeBuilder.Routes.Insert(0, AttributeRouting.CreateAttributeMegaRoute(serviceProvider));

            // TODO: The homepage route is not set via the Plato.Core module
            // Attempt to get homepage route for tenant from site settings store
            // If the tenant has not been created yet siteService will return null
            // if siteService returns null users will be presented with the SetUp module
            ////var siteService = routeBuilder.ServiceProvider.GetService<ISiteSettingsStore>();
            ////if (siteService != null)
            ////{

            ////    //// Add the default template route to each shell
            ////    prefixedRouteBuilder.Routes.Add(new Route(
            ////        prefixedRouteBuilder.DefaultHandler,
            ////        "PlatoHome",
            ////        "",
            ////        new HomeRoute(),
            ////        null,
            ////        null,
            ////        inlineConstraintResolver)
            ////    );

            ////    // Add home page route matching
            ////    var homeRoute = new HomePageRoute(
            ////        shellSettings.RequestedUrlPrefix,
            ////        siteService,
            ////        routeBuilder,
            ////        inlineConstraintResolver);

            ////    routeBuilder.Routes.Add(homeRoute);

            ////}

            // ------------------

            // Build router
            var router = prefixedRouteBuilder.Build();

            // Use router
            appBuilder.UseRouter(router);

            // Create a captured HttpContext for use outside of application context
            var capturedHttpContext = serviceProvider.GetService <ICapturedHttpContext>();

            capturedHttpContext.Configure(state => state.Contextualize(httpContext));

            // Create a captured router for use outside of application context
            var capturedRouter = serviceProvider.GetService <ICapturedRouter>();

            capturedRouter.Configure(options =>
            {
                options.Router  = router;
                options.BaseUrl = $"{httpContext.Request.Scheme}://{httpContext.Request.Host}{httpContext.Request.PathBase}";
            });

            // Build & return new pipeline
            var pipeline = appBuilder.Build();

            return(pipeline);
        }