【问题标题】:ASP.NET Core 2 load conventional routes (routing table) from another classASP.NET Core 2 从另一个类加载常规路由(路由表)
【发布时间】:2018-03-30 19:11:25
【问题描述】:

我目前正在开发一个 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?

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

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 中的配置方法中吗?

非常感谢!!

【问题讨论】:

  • 只需将routes 传递给该外部类并让它配置它们
  • 这不是我想要的,不过谢谢!我想在这篇文章中创建一个扩展方法:
  • 并使用扩展方法配置我所有的常规路由...
  • 还是看不出什么问题,然后创建扩展方法并使用它:'routes.UseMyConventionalRoutes()'。

标签: c# asp.net-core


【解决方案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 方法,接下来我调用一个类来配置我的所有路由。

我不知道这是否是最好的解决方案,但效果很好......你觉得呢? 谢谢:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    相关资源
    最近更新 更多