2016-06-23 6 views
1

NancyFxにという動的ルートを設定する必要があります。特定のブログやページを識別するために、url-slugsを使用するブログや動的CMSを考えてみてください。私はそれがNancyFxで書かれていれば、SOは何かのことをしていると思います...NancyFxのダイナミックルート

何千もの異なるURLスラッグ(データベースから取り出されたページコンテンツ)があるかもしれないので、ルーティングテーブル最良のアプローチではありません。

私は私のNancyModuleのコンストラクタで、次の操作を実行しようとしました:作品のこの種の

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

が、次の制限があります。

  1. ルートが一度構築されていますWebアプリケーションの開始時に(NancyFxは最初に検出されたすべてのルートをキャッシュします)。後で実行時に動的に追加される新しいルート(固有のスラッグを持つページまたはブログエントリ)は認識されません。

  2. わずかな数の訪問がありますが、すべてのルートが事前構築されています。ページ/ユニークなナメクジのリストが何千もある場合、これは非常に無駄です。

誰もがNancyFxに動的にルーティングするための戦略を提案することができ、それは - ユニークなナメクジを持つページが動的に追加される - I異なるナメクジとデフォルトPageModuleへのルートはどうすればよいですか?また、あらかじめ定義されたルートを持つモジュールも引き続き使用する必要があります。例えば、私はHomeModuleへのルートにこれらのURLたい:

/ 
/topic1 
/topic2 
/topic3 
... 

(および以下に具体的に列挙されたものを除く他のトピックの任意の数を、)が、以下は、それらを扱う、独自のモジュールを持っている、つまりがある場合競合スラグで定義されたページ/ブログ投稿、それが到達可能ではないでしょう。

/admin 
/gallery 
/image 

注:可能であれば、私は特に/page/{page-slug}のように、URLに特化したモジュールのセグメントの必要性を回避したいです。 page-slugが別のモジュールであらかじめ定義されていない場合は、catch-all HomeModuleで処理します。

答えて

1

ルートはナンシーで重み付けされています。これは、非常に具体的なものがあまり具体的でないものを選択することを意味します。

あなたが定義されている場合:

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

http://test.com/adminへの呼び出しは、さらにより多くのあなたが動的に追加することはできませんすべてのルート/{topic}

/adminと以下の特定のキャッチされ、より具体的なルートでピックアップされます最初のロード時に解析され、キャッシュされるため、リストが最初に定義されていない限り、最初のリクエストが通過したときにルックアップのみが行われるためです。

あなたは、これは検索時間を増やし、PERFを妨げる、特定のルートの数百を追加する必要はありません(あなたはミリ秒単位で心配している場合)

ルートの重みが、ここで定義されています。

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

ご覧のとおり、特定のルートは10,000で重み付けされ、キャッチオールは1000で重み付けされます。

+0

夜中に質問する必要はありません。朝に来て、あなたの答えを見て、それは明らかなようです。 :-)徹底的な説明をいただきありがとうございます。 – Optimax

関連する問題