Jun's blog

仕事や趣味について綴ります

ASP.NET Web APIのattributeルーティングについて

ASP.NET Web API 2から使えるattributeルーティング

ASP.NET Web API 2からattributeルーティングと呼ばれるルーティング設定が可能になりました。
以前から使えるconvention-basedルーティングと比較しながらまとめてみたいと思います。

convention-basedルーティングってどんなの?

まずはWeb APIのリリース当初から使えるconvention-basedルーティングについて。
Visual StudioでWeb APIのテンプレートからプロジェクトを作成するとWebApiConfigのRegisterメソッド内にこんな感じのコードありますよね。これです。

// これがconvention-basedルーティングの設定
config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

じゃあattributeルーティングってどんなの?

対してattributeルーティングでは以下のようにアクションメソッド毎にルーティングの設定を行います。

// これがattributeルーティングの設定
[Route("customers/{customerId}/orders")]
public IEnumerable<Order> GetOrdersByCustomer(int customerId) { ... }

比較

2つのルーティング設定のメリット・デメリットを比較するとこんな感じです。

ルーティング メリット デメリット
convention-based ルートテンプレートが一箇所で定義可能。ルーティングルールが全てのコントローラーに対して一貫して適用される 一般的なREST APIURIパターンをサポートすることが難しい。例えば/customers/1/ordersのようなURIにしようと思った場合に難しい。
attribute 簡単に/customers/1/ordersのようなURIのルーティングを設定できる 使い方による

あえてattributeルーティングのデメリットを「使い方による」と書いたのは使い方次第でデメリットとなりうる場合があるからです。
例えば、それほどAPIの種類も多くなくURIのパターンも単純な場合(convention-basedで全てのルーティングが事足りる場合)にわざわざattributeルーティングを使用するとメソッド毎にルーティングの設定が必要なため複雑さが多少増してしまうと思います。それでもAPIの多機能化が将来予見される場合には最初からattributeルーティングベースで作るのもありかと思います。
「ベース」と書いたのは実はこの2つのルーティングは混在させる事が可能だからです。うまく組み合わせるといいと思います。

まとめ

attributeルーティングについて超簡単にまとめてみました。
うまく2つのルーティングを使い分けたいですね。
attributeルーティングは他にもパラメータに制約を設けたりと色々設定できます。
attributeルーティングの書き方について詳しく知りたい方はこちらをご覧ください。

今回は以上です。