2016-06-23 24 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