You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:10:19