ASP.Net 用の代替 MVC フレームワークを設計しています。フレームワークに対する私の目標の 1 つは、「魔法」をできるだけ少なくすることです。私が持っている唯一のリフレクションは、フォーム、クエリ文字列などを単純な古いクラスにバインドすることです(無視、変換などのオプションの属性を使用)。そのため、クラス/メソッドの検出は一切行いません。すべてが非常に明確でなければなりません。API「シェイプ」を約 3 回繰り返しました。最初の 2 つは魔法を持たないという私の目標を達成しましたが、非常に冗長で読みにくいものでした..通常、コントローラーは MVC フレームワークが行うべき重い仕事をしなければなりませんでした。
そのため、この 3 回目の反復では、正しく行うために非常に懸命に努力しています。私が別のやり方で少し物議をかもしていることの 1 つは、ルーティング コードです。すべてが明示的であり、リフレクションは推奨されないため、ルートを解決するためにコントローラー内の属性を検索することはできません。すべてをルート レベルで指定する必要があります。最初の反復ではこれは行われませんでしたが、非常に扱いにくく冗長なコントローラーになりました...
現在、ルートを指定するための流暢な API があります。これは、私が最初に想像したものを少し超えており、現在では、コントローラーのメソッドで何ができるか、何を受け入れる必要があるかを指定する一種の方法として機能しています。
実際のコードに進みます。実装は無関係です。本当に知っておく必要がある唯一のことは、多くのジェネリック型が含まれているということです。そのため、いくつかのルーティングの簡単なサンプルを次に示します。
var router=new Router(...);
var blog=router.Controller(() => new BlogController());
blog.Handles("/blog/index").With((ctrl) => ctrl.Index());
blog.Handles("/blog/{id}").With((ctrl,model) => ctrl.View(model["id"])).WhereRouteLike((r) => r["id"].IsInteger()); //model defaults to creating a dictionary from route parameters
blog.Handles("/blog/new").UsingFormModel(() => new BlogPost()).With((ctrl, model) => ctrl.NewPost(model)); //here model would be of type BlogPost. Also, could substitue UsingRouteModel, UsingQueryStringModel, etc
WhereModelIsLike
モデルの検証を行うなど、実装できる他の方法もいくつかあります。しかし、この種の「仕様」はルーティング層に属しますか? ルーティング層で指定する必要がある制限は何ですか? 検証するためにコントローラに何を残す必要がありますか?
ルーティング層に心配をかけすぎていませんか?