// 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); }
// 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); }