14

Web APIがRESTに重点を置いていることはわかっていますが、コマンド/応答シナリオを処理できる単一のコントローラーメソッドを構成したいと思います。これまでのところ成功していません...単一のAPIエンドポイントで次のクラス構造を認識させる方法はありますか?

[Serializable]
public abstract class Command{
    public int CommandId{get; set;}
}
[Serializable]
public class RegisterNewPersonCommand:Command{
   public string Name{get; set;}
}
//etc... various Command subclasses. Similar thing for Responses.

//now have a single endpoint to Handle Commands
public class CommandsController : ApiController{
   public Response HandleCommand(Command command){
      //handle Command based on which subclass it is
      //return appropriate Response subclass
   }
}

これまでのところ、シリアル化システムがこのシナリオを処理できるようには見えませんが、誰かがそれを行う方法を見つけてくれることを願っています:)

4

1 に答える 1

15

ポリモーフィズムがWebAPIで機能するためには、型名処理を有効にする必要があり、データには型情報が含まれている必要があります。

シナリオでJSONを使用している場合は、オンにする必要がありTypeNameHandlingます。WebApiConfig.cs

config.Formatters.JsonFormatter.SerializerSettings.TypeNameHandling = 
    Newtonsoft.Json.TypeNameHandling.All;

次に、アクションに送信するコンテンツ本文にHandleCommand(...)は、タイプ情報が含まれている必要があります。

{"$type":"MvcApplication.Models.RegisterNewPersonCommand, MvcApplication", ... }

XMLの場合、DataContractのKnownTypeを使用する必要があります...

ちなみに、使用している理由はありますか[Serializable](POCOタイプや[DataContract]タイプもサポートされているので…)?

于 2012-11-28T17:35:31.530 に答える