2016-06-23 22 views
1

我需要能够在NancyFx动态路线。考虑一个博客或动态CMS,它使用url-slugs来标识特定的博客/页面。我想,如果它是用NancyFx编写的,那么SO会做这样的事情...NancyFx的动态路线

由于可能有成千上万个不同的url-slugs(页面内容从数据库中提取),所以预先构建一个路由表不是最好的方法。

我试着做以下,我NancyModule的构造函数:

public HomeModule() 
{ 
    ... 
    foreach (var page in pages) 
    { 
     Get(page.Slug, args => GetPage(page.Slug)); 
    } 
} 

这种类型的作品,但具有以下限制:

  1. 路由是一次构建,在Web应用程序的开始处(NancyFx缓存它在开始时发现的所有路线)。无法识别任何可能在运行时动态添加的新路线(具有其独特的slu pages的页面或博客条目)。

  2. 所有路线都是预建的,即使只有少数人可能会被访问​​。如果页面/独特的slu list的数量是成千上万,这是非常浪费的。

任何人都可以提出在NancyFx动态路由策略,那就是 - 与独特的蛞蝓页面动态添加 - 我怎么路线的不同蛞蝓默认PageModule?此外,预定义模块及其路线仍应该受到尊重。例如,我想这些URL路由到HomeModule

/ 
/topic1 
/topic2 
/topic3 
... 

(和任何数量的其他议题,除以下具体列出),但下面有自己的模块处理它们,即如果有与冲突塞定义页/博客文章,这将是不可到达的:

/admin 
/gallery 
/image 

注意:如果可能的话,我特别要避免在URL专门的模块段的需求,如/page/{page-slug}。如果page-slug没有在另一个模块中预定义,我想要全部HomeModule来处理它。

回答

1

路线在南希加权,这意味着非常具体的东西将被挑选的东西不太具体。

如果定义:

Get("/admin", ...); 
Get("/gallery", ...); 
Get("/image", ...); 
Get("/{topic}", ...); 

http://test.com/admin的呼叫将通过为/admin,而不是更少的具体包罗万象的路线更特殊的路由被拾起/{topic}

而且更不能动态地添加除非您的列表是一次性定义的,因为它们在第一次加载时被解析并被缓存,所以只有在第一次请求经过时才进行查找。

你不想添加特定的路线100S,这将增加查找时间和阻碍PERF(如果你关心毫秒)

路由权重定义如下:

https://github.com/NancyFx/Nancy/wiki/Defining-routes#pattern

正如你所看到的,一条特定路线的权重为10,000,而所有权重均为1000.

+0

我不应该在半夜问问题。来吧,看看你的答案,看起来很明显。 :-)谢谢你的详细解释。 – Optimax