1

サービスを設計するときにAsp.NETMVCコントローラーがどのように機能するかについてはかなり満足しています。ただし、新しいWebAPIコントローラー。ここでサービスをどのように設計するのですか?

たとえば、ユーザーを一覧表示する3つの異なる方法があるとします。

最新の10個を取得、すべてを取得、非アクティブにするなど。

これらのどれもパラメータを必要としないかもしれません。では、WebAPIでこれをどのように解決しますか

IEnumerable<User> Get10Latest()
IEnumerable<User> GetAll()
IEnumerable<User> GetInactive()

それらは同じパラメータ署名を持っているので、それは機能しません。では、ここでこれを設計する正しい方法は何ですか?

4

3 に答える 3

1

actionパラメーターを使用することにより、単一のHTTPメソッドに対して1つのコントローラーで複数のメソッドをサポートできます。
例えば

public class UsersController : ApiController
{

    [ActionName("All")]
    public HttpResponseMessage GetAll()
    {
        return new HttpResponseMessage();
    }

    [ActionName("MostIQ")]
    public HttpResponseMessage GetMostIQ()
    {
        return new HttpResponseMessage();
    }

    [ActionName("TenLatest")]
    public HttpResponseMessage GetTenLatest()
    {
        return new HttpResponseMessage();
    }

}

残念ながら、アクションの有無にかかわらず、単一のコントローラーで同時に処理できるようにする方法は見つかりませんでした。

例えば

public class UsersController : ApiController
{

    [ActionName("")]  // Removing this attribute doesn't help
    public HttpResponseMessage Get()
    {
        return new HttpResponseMessage();
    }

    [ActionName("All")]
    public HttpResponseMessage GetAll()
    {
        return new HttpResponseMessage();
    }

    [ActionName("MostIQ")]
    public HttpResponseMessage GetMostIQ()
    {
        return new HttpResponseMessage();
    }

    [ActionName("TenLatest")]
    public HttpResponseMessage GetTenLatest()
    {
        return new HttpResponseMessage();
    }

}

コレクションリソースとそのすべてのサブセットに単一のコントローラーを使用できると便利です。

于 2012-11-27T20:07:00.740 に答える
0

誰かが一緒にいて、このためのナックルで私を包み込むでしょうが、Getsを処理するようにルーティングを構成する必要があります。これが私が上記の操作でそれを動作させる方法です:

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

これで、リクエストはルートテンプレートを介して正しいコントローラー->アクションにマップされます。新しいルートを最初にWebApiConfig.csに登録する必要があることに注意してください。古いものを保持する場合は、デフォルトのもの。

編集

質問を読み直してみると、デザインの質問に完全には答えていなかったことがわかりました。それを実現する1つの方法は、RESTの観点から、別のリソースを使用して適切なコレクション(Get10Latestなど)を公開することだと思います。これは、データの正確なサブセットを公開するビジネス上の理由があると想定しているためです。サービス。その場合、独自のコントローラーで単一のGetを介してそのリソースを公開します(それが望ましい動作である場合)。

于 2012-11-27T11:58:29.290 に答える
0

さて、なぜこのようなURLを持っていないのですか?

GET /users
GET /users/latest
GET /users/inactive

ルーティングを使用して、それらをにルーティングできます

public classs UserController : ApiController
{
    public IEnumerable<User> Get(string mode)
    {
        // mode is in routing restricted to be either empty, latest, or inactive
     }
 }

それ以外の場合は、複数のコントローラーを使用してください。Web APIでのアクション名の使用は、それについての一種の間違った方法です。

于 2013-04-05T09:07:38.743 に答える