// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using Microsoft.AspNetCore.Mvc.Core; using Microsoft.AspNetCore.Mvc.Internal; using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.DependencyInjection; namespace Microsoft.AspNetCore.Builder { /// /// Extension methods for to add MVC to the request execution pipeline. /// public static class MvcApplicationBuilderExtensions { /// /// Adds MVC to the request execution pipeline. /// /// The . /// A reference to this instance after the operation has completed. /// This method only supports attribute routing. To add conventional routes use /// . public static IApplicationBuilder UseMvc(this IApplicationBuilder app) { if (app == null) { throw new ArgumentNullException(nameof(app)); } return app.UseMvc(routes => { }); } /// /// Adds MVC to the request execution pipeline /// with a default route named 'default' and the following template: /// '{controller=Home}/{action=Index}/{id?}'. /// /// The . /// A reference to this instance after the operation has completed. public static IApplicationBuilder UseMvcWithDefaultRoute(this IApplicationBuilder app) { if (app == null) { throw new ArgumentNullException(nameof(app)); } return app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); } /// /// Adds MVC to the request execution pipeline. /// /// The . /// A callback to configure MVC routes. /// A reference to this instance after the operation has completed. public static IApplicationBuilder UseMvc( this IApplicationBuilder app, Action configureRoutes) { if (app == null) { throw new ArgumentNullException(nameof(app)); } if (configureRoutes == null) { throw new ArgumentNullException(nameof(configureRoutes)); } // Verify if AddMvc was done before calling UseMvc // We use the MvcMarkerService to make sure if all the services were added. if (app.ApplicationServices.GetService(typeof(MvcMarkerService)) == null) { throw new InvalidOperationException(Resources.FormatUnableToFindServices( nameof(IServiceCollection), "AddMvc", "ConfigureServices(...)")); } var routes = new RouteBuilder(app) { DefaultHandler = app.ApplicationServices.GetRequiredService(), }; configureRoutes(routes); routes.Routes.Insert(0, AttributeRouting.CreateAttributeMegaRoute(app.ApplicationServices)); return app.UseRouter(routes.Build()); } } }