2012-11-28 13 views
13

私はWeb APIがRESTに焦点を当てていることを認識していますが、Command/Responseシナリオを処理できる単一のコントローラメソッドを構成したいと考えています。これまで私は成功していません...単一のAPIエンドポイントによって次のクラス構造を認識させる方法はありますか?多型は、Web APIで動作するためには、それ:)Web APIの多型:単一のエンドポイントが可能ですか?

+0

たとえ動作しても、どのようにしてコードを再利用できますか? – Aliostad

+0

コントローラのコードを減らしたい。 Command( 'HandleNewUserCommand(NewUserCommand){}、HandleUserPasswordChangeCommand(UserPasswordChangeCommand){} 'など)の各サブクラスの定型メソッドの代わりに、単一の' HandleCommand'メソッドは、リフレクションとIoCを使用してコマンドを適切なドメインロジック。 – smalltowndev

答えて

14

を行う方法が発見したから

[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 
    } 
} 

は、これまでのところ、このシナリオを扱うことができる直列化システムをいないようですが、私は誰かを願っています型名の扱いを有効にする必要があり、データに型情報が含まれている必要があります。あなたはあなたのシナリオでJSONを使用している場合WebApiConfig.csTypeNameHandlingをオンにする必要があります

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

その後、あなたはHandleCommand(...)アクションに送信されたコンテンツ本体は、型情報が含まれている必要があります。

XMLについては
{"$type":"MvcApplication.Models.RegisterNewPersonCommand, MvcApplication", ... } 

、あなたがのDataContractのKnownTypeを使用する必要があります...ところで

があり、 y [Serializable]を使用している理由(POCOタイプと[DataContract]タイプもサポートされています...)

+0

これは正しいアイデアのようです。 $ type情報を含めるようにHttpClientを設定する方法はありますか?私のテストでは、 'var task = client.PostAsJsonAsync(" api/commands/handlecommand "、testCommand);'はjsonにシリアル化するときに$ type情報を含みません。 – smalltowndev

+1

これは私の質問に答え、クライアント側で書式を指定する方法を理解する手助けをしました。最も単純なクライアントコードは次のようなものです: 'private void SendCommand(コマンドコマンド){var json = new JsonMediaTypeFormatter {SerializerSettings = {TypeNameHandling = TypeNameHandling.All}}; var response = client.PostAsync(" api/commands/handlecommand "、command、json).Result; //応答を処理する}' – smalltowndev

+0

これは私を助けました。私はインターネット上で検索する必要があった唯一のものは、インターフェイスがシリアル化できないこと、しかし、私は忘れてしまったように見えます。:) ICollection、IEnumerableではなく、List <>などを使用しています。今、多態型のシリアル化が動作しています。私のDTOを平坦化します:p – GetFuzzy

関連する問題