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



我当前正在处理ASP.NET Core 2应用程序。我在Startup.cs配置方法中配置中间件。在此方法中 - 配置 - 我也设置了常规路线。(我的应用程序中不需要属性路由(。

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

现在,我尝试弄清楚如何从外部类加载传统的路由表。

我当前的路由表看起来很规律:

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类创建扩展方法的方法,例如在此文章中:

如何在ASP.NET Core中写入中间件作为自定义路由器?

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

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上设置默认处理程序。"

您知道如何将我的路由表从另一类或扩展方法加载到我的配置方法中。

非常感谢!

这是我的解决方案:

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?}");
    }
}

首先,我创建了一个扩展方法清理配置方法,接下来,我调用类以配置所有路由。

我不知道这是否是最好的解决方案,但是它可以正常工作...您怎么看?谢谢:(

最新更新