ASP.NET Core 2从另一个类加载常规路由(路由表)

时间:2018-03-30 08:44:45

标签: c# asp.net-core

我目前正在使用ASP.NET Core 2应用程序。我在Startup.cs Configure方法中配置我的中间件。在此方法 - 配置 - 我也设置我的传统路线。 (我的应用程序中不需要属性路由)。

问题是,一旦应用程序增长,由于代码量很大,配置可能会有点混乱。

现在我试着弄明白,如何从外部类加载传统的路由表。

我当前的路由表看起来非常规则:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseStaticFiles();

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}

现在我试着弄明白,如何从另一个类加载我的路线:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseStaticFiles();

    app.UseMvc(routes =>
    {
        // .. I want to load my conventional routes from an external class
    });
}

我只想到有一种方法可以使用RouteBuilder类创建一个扩展方法,就像在这篇文章中一样:

How to write a middleware as custom router in asp.net core?

因此,在我的Configure方法中,我可以简单地调用类似的东西:

app.UseMyCoolRouter();

我的问题是,我真的不知道如何配置RouteHandler来处理常规请求:

var rh = new RouteHandler(context => 
{
    // ... how to configure for regular routes?
});

var rb = new RouteBuilder(app, rh);

rb.MapRoute(name: "default", template: "{controller=Home}/{action=Index}/{id?}");

app.UseRouter(rb.Build());

当我在没有RouteHandler的情况下创建RouteBuilder实例时:

var rb = new RouteBuilder(app);

我只获得了空引用异常:

"必须在IRouteBuilder上设置默认处理程序。"

您知道如何将我的路由表从另一个类或扩展方法加载到Startup.cs中的Configure方法中吗?

非常感谢!!

1 个答案:

答案 0 :(得分:1)

这是我的解决方案:

public class Startup
{
   //...    
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {   
        app.UseDemoRoutes();
    }
}

public static class ApplicationExtensions
{
    public static IApplicationBuilder UseDemoRoutes(this IApplicationBuilder app)
    {
        app.UseMvc(routes => new DemoRouter(routes));

        return app;
    }
}

public class DemoRouter
{    
    public DemoRouter(IRouteBuilder routes)
    {
        ConfigureRoutes(routes);
        // ConfigureMoreRoutes(routes);
    }

    private void ConfigureRoutes(IRouteBuilder routes)
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    }
}

首先我创建了一个扩展方法来清理Configure方法,然后我调用一个类来配置我的所有路由。

我不知道这是否是最佳解决方案,但它运作正常......你怎么看? 谢谢:))