2010-12-31 6 views
0

私はWebフレームワーク用のUrlルータを作成しています。可能な限り使用するようにフレンドリーにしようとしています。 APIのようなものになります。Url-router APIの設計に関する質問

Route[] Routes = { 
    new Route(@"/user:(?<id>\d+)", "UserController.View") 
}; 

をどこだろうルートのようになりますそのメソッドにその正規表現に一致するすべてのURL、:

public class UserController : Controller 
{ 
    public void View(int id) 
    { 
     // code here 
    } 
} 

それはタイプキャスト自動的に処理します。

(?<id>...)には、メソッドに必要な引数があります。 View()関数は、名前のキャプチャによって提供されるすべての引数を受け入れる必要があります()。しかし、それはオプションである限り、以上の引数を受け入れることができます。たとえば、その正規表現は関数View(int id, int extraArg=2)にも一致しますが、関数を呼び出すのに実際にはextraArgは必要ないためです。

質問は、そのルートも関数と一致する必要がありますView() - 引数なし? idのキャプチャは簡単に破棄することができます。または例外をスローする必要があります(現在のように)?

答えて

1

最高のプログラミングアプローチを取ってください。ユーザーにエラーが発生しないようにしてください。 ユーザーが誤って/意図的に余分なパラメータを任意の段階に入れることがあることを見て、必要なパラメータを取り、残りを無視します。

+0

ユーザーにエラーが表示されないようにしてもよろしいですか?パターンにargsを追加するのは実際に受け入れられるよりも誤りではありませんか?はい、エラーは厄介ですが、それはまた、彼が将来の頭痛を捜すのを助けてくれるかもしれません...実際、どの変数が欠落しているかを見るのはかなり簡単ですが、もう1つ問題があります。このような緩やかなマッチングを許せば、有効なオーバーロードである 'View()'と 'View(int id)'の両方と一致します。どちらを選ぶべきですか? – mpen

+0

興味深い問題ですが、私はそれを言ったときにエンドユーザーを指していました。たぶん、何かもっとCodeIgniterスタイルを試してみてください。コントローラーメソッドは、提供された変数を含むページ呼び出しに関する情報を含むクラスを受け取り、コントローラーをそのまま並べ替えます。 –

関連する問題