【问题标题】:Route name by convention or module name in NancyFXNancyFX 中按约定或模块名称命名的路由名称
【发布时间】:2016-05-31 17:16:32
【问题描述】:

当我们在 NancyFX 应用程序中创建模块时,我们会以这种方式进行路由:

public class HappyModule : Nancy.NancyModule
{
    public HappyModule() : base("/Happy")
    {
        Get["/"] = _ => "Received GET request";
    }
}

所以,当我们点击http://<host>:<port>/Happy/ 时,我们会得到预期的响应。但是,我认为硬编码路由不是“非常可维护”的事情(特别是在大型系统上),所以问题是:有没有办法设置约定或使路由由其各自命名的东西模块名称,所以这样我就不必总是需要扩展/硬编码路由基本 NancyModule 构造函数?

我真正想知道的是:有没有类似于我们在 ASP.NET WebApi 中的路由机制(代码如下)?

    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
        config.MapHttpAttributeRoutes();
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }

        );
    }

【问题讨论】:

标签: c# asp.net-web-api url-routing nancy


【解决方案1】:

对您的问题的简短回答是不。我们不支持 Nancy 中的路线约定。


根据我的个人经验,我从事的每个项目都偏离了 MVC 中的约定,最终使用了属性路由。这些约定只能让您走这么远,然后您才会像“等等,我怎么才能再次到达这条路线?”

然后,您最终会筛选文件,试图找出路由注册的位置。

API 应该定义一次,并且很少需要更改(如果有的话)。定义接近实现的路线可确保您可以轻松找到内容。

基本路径允许您定义站点的区域。例如,您可以为管理区域定义一个抽象模块,而不是到处写/admin

public abstract class AdminModule : NancyModule
{
    public AdminModule() : base("/admin"){}
    public AdminModule(string path) : base("/admin/" + path.TrimStart('/')){}
}

类似这样,所有管理模块都从这里继承,以确保所有路径都以/admin为前缀

【讨论】:

  • 我很好奇如果 AdminModule 基类定义了一个路由并且一个子类覆盖了该路由会发生什么行为——当该路由被命中时,处理程序是否总是子类?
猜你喜欢
  • 1970-01-01
  • 2014-02-18
  • 2010-10-22
  • 1970-01-01
  • 2017-10-28
  • 2018-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多