3

Web API では、デフォルト ルートは次のとおりです。 /api/locations/123?days=5

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

しかし、このようなルートで/api/locations/123/events?days=5ヒットできるようにしながら、ルートをこのように見せたいとしたらどうでしょうか。LocationsController/api/locations/123?state=md

コントローラ:

public class LocationsController : ApiController {

    // GET api/locations/123/events?days=5
    public IEnumerable<Event> GetEventsByDays(int idLocation, int days) {
        // do stuff
    }

    // GET api/locations/123?state=md
    public IEnumerable<Location> GetLocationsByState(string state) {
        // do stuff
    }
}

ここには実際に 2 つの質問があります。

  1. LocationsControllerイベントを返すを持つことは理にかなっていますか、それとも完全に別のコントローラーが必要ですか?
  2. このようなルートを許可するには、ルートをどのようWebApiConfigに設定しますか?
4

2 に答える 2

1

あなたは2つの異なることについて話している:

ルーティング

ルーティングは ASP.NET MVC & Web Api で使用され、URL をコントローラーやアクションに直接マップします。これは、開発者が人間が読める URL の設計 (製品サポートや検索エンジンのインデックス作成など) に集中できるため、読みやすさの点で特に役立ちます。ここで重要なのは、ルートとコントローラーの間に一意の関係がないことです。必要に応じて、同じコントローラー/アクションをマップする 10 個のルートを作成できます。

たとえば、2 つのルートは次のようになります。

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
); 
config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{idLocation}/events/{days}",
    defaults: new { id = RouteParameter.Optional }
); 

/api/locations/123?state=mdまた、デフォルト ルート テンプレートでは正しくないことに注意してください。です/api/locations/123。URL に余分なパラメーターがあるため、GetLocationsByState を実行します。

コントローラ

コントローラーごとに 1 つの責任を持ち、できるだけ小さく保つことをお勧めします。ビジネス ロジックは別の場所にある必要があります。

Jeffrey Palermo (On​​ion Architecture の作成者) は次のように述べています。

画面をスクロールせずに ASP.NET MVC アクション メソッドを表示できない場合は、問題があります。

結局、あなたはすべてのように、良いか悪いかを気にせずに、やりたいことをすることができます。難しいのは、常にアーキテクチャをセットアップすることではなく、独自のルールを維持して従うことです。

これがお役に立てば幸いです。あなたはルーティングにあまり慣れていないと思いますので、導入部とアクションの選択をためらわずに読んでください。

于 2013-05-17T19:58:26.590 に答える
0

場所に関係なくイベントを操作したい場合は、イベント用に別のコントローラーを用意できます。これが役立つかどうかを確認してください。

于 2013-05-17T17:49:02.563 に答える