ASP.NET Core 2如何从外部类加载约定路由表
从外部类加载ASP.NET Core 2约定路由的实现方案
这个场景我太熟悉了——当应用规模上来后,Startup.cs里堆一堆路由配置确实会显得杂乱不堪,把路由逻辑抽离到外部类是非常好的实践,既整洁又方便维护。下面给你两种适合ASP.NET Core 2的实用方案,你可以根据自己的需求选:
方案一:使用静态扩展方法(最简洁)
这种方式最直接,把路由封装成IApplicationBuilder的扩展方法,让Startup里的代码保持清爽:
首先创建一个专门的路由配置静态类,比如放在Routing文件夹下:
public static class ConventionalRouteExtensions { public static IApplicationBuilder UseConventionalRoutes(this IApplicationBuilder app) { app.UseMvc(routes => { // 在这里编写所有约定路由规则 routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); // 示例:后台管理路由 routes.MapRoute( name: "admin_area", template: "admin/{controller=Dashboard}/{action=Index}/{id?}"); // 其他自定义路由... }); return app; } }
然后在Startup.cs的Configure方法里,直接调用这个扩展方法就行:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { // 先配置各种中间件 if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseCookiePolicy(); app.UseAuthentication(); // 一行代码加载所有路由 app.UseConventionalRoutes(); }
方案二:独立路由配置类(支持依赖注入)
如果你的路由配置需要读取配置文件或者依赖其他服务,这种方式更灵活——把路由逻辑放到一个可注入的类中:
首先创建路由配置类:
public class ConventionalRouteConfigurator { private readonly IConfiguration _configuration; // 通过构造函数注入需要的服务,比如IConfiguration public ConventionalRouteConfigurator(IConfiguration configuration) { _configuration = configuration; } public void ConfigureRoutes(IRouteBuilder routes) { // 可以从配置文件读取路由模板,方便后期修改 var defaultRouteTemplate = _configuration["Routing:DefaultTemplate"] ?? "{controller=Home}/{action=Index}/{id?}"; routes.MapRoute( name: "default", template: defaultRouteTemplate); // 其他路由规则... routes.MapRoute( name: "product_details", template: "products/{category}/{id}/{slug}", defaults: new { controller = "Products", action = "Details" }); } }
然后在Startup.cs的ConfigureServices里注册这个类:
public void ConfigureServices(IServiceCollection services) { services.Configure<CookiePolicyOptions>(options => { options.CheckConsentNeeded = context => true; options.MinimumSameSitePolicy = SameSiteMode.None; }); // 注册路由配置类,这里用Scoped或者Singleton都可以 services.AddScoped<ConventionalRouteConfigurator>(); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); }
最后在Configure方法里使用这个类:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ConventionalRouteConfigurator routeConfigurator) { // 中间件配置... app.UseMvc(routes => { // 调用配置类的方法加载路由 routeConfigurator.ConfigureRoutes(routes); }); }
额外小建议
- 把路由配置类放在单独的文件夹(比如
Routing或Configurations),和其他配置类归类管理,项目结构更清晰 - 如果路由规则非常多,可以进一步拆分,比如分
AdminRoutes、FrontendRoutes等多个类,然后在主配置类里调用它们的方法
内容的提问来源于stack exchange,提问作者TimHorton
相关产品推荐
相关产品推荐

