私はWeb APIがRESTに焦点を当てていることを認識していますが、Command/Responseシナリオを処理できる単一のコントローラメソッドを構成したいと考えています。これまで私は成功していません...単一のAPIエンドポイントによって次のクラス構造を認識させる方法はありますか?多型は、Web APIで動作するためには、それ:)Web 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
}
}
は、これまでのところ、このシナリオを扱うことができる直列化システムをいないようですが、私は誰かを願っています型名の扱いを有効にする必要があり、データに型情報が含まれている必要があります。あなたはあなたのシナリオでJSONを使用している場合WebApiConfig.cs
にTypeNameHandling
をオンにする必要があります
:
config.Formatters.JsonFormatter.SerializerSettings.TypeNameHandling =
Newtonsoft.Json.TypeNameHandling.All;
その後、あなたはHandleCommand(...)
アクションに送信されたコンテンツ本体は、型情報が含まれている必要があります。
{"$type":"MvcApplication.Models.RegisterNewPersonCommand, MvcApplication", ... }
、あなたがのDataContractのKnownTypeを使用する必要があります...ところで
があり、 y [Serializable]
を使用している理由(POCOタイプと[DataContract]
タイプもサポートされています...)
これは正しいアイデアのようです。 $ type情報を含めるようにHttpClientを設定する方法はありますか?私のテストでは、 'var task = client.PostAsJsonAsync(" api/commands/handlecommand "、testCommand);'はjsonにシリアル化するときに$ type情報を含みません。 – smalltowndev
これは私の質問に答え、クライアント側で書式を指定する方法を理解する手助けをしました。最も単純なクライアントコードは次のようなものです: 'private void SendCommand(コマンドコマンド){var json = new JsonMediaTypeFormatter {SerializerSettings = {TypeNameHandling = TypeNameHandling.All}}; var response = client.PostAsync(" api/commands/handlecommand "、command、json).Result; //応答を処理する}' – smalltowndev
これは私を助けました。私はインターネット上で検索する必要があった唯一のものは、インターフェイスがシリアル化できないこと、しかし、私は忘れてしまったように見えます。:) ICollection、IEnumerableではなく、List <>などを使用しています。今、多態型のシリアル化が動作しています。私のDTOを平坦化します:p – GetFuzzy
- 1. 単一のメソッドから異なる型を返すC#web api
- 2. WSO2単一のAPIの複数のスコープが可能
- 3. Rails Web APIでの単一スキーマのマルチテナント
- 4. アクチュエータ - カスタムログファイルのエンドポイントは可能ですか?
- 5. 一種の単純な多型に使用できますか?
- 6. 可能な多くのタイプから単一の列挙型値を保存する
- 7. コードブロック、単一プロジェクト、多くの実行可能ファイル
- 8. 同じアプリケーションのWeb APIエンドポイント
- 9. 非同期のWeb APIエンドポイント
- 10. WCFのヘルプページを持つASP.Net MVC4 Web APIが可能ですか?
- 11. Yii2 Webおよび残りのAPIを介してエンドポイントにアクセス可能
- 12. 単一のエンドポイントの複数の投稿要求のOpen Apiドキュメント
- 13. 単一の整数のWeb APIレスポンスタイプ
- 14. Web APIの単一コントローラ、単一サービス、複数リポジトリパターン
- 15. エクスプレスjs apiエンドポイントが晴れのあるWebアプリケーションでは機能しない
- 16. 一般的なエンドポイントと特定のエンドポイント - 安らかなAPIデザイン
- 17. Conntrackは単一のインターフェイスで可能ですか?
- 18. 単一ページのWebサイトのフルページナビゲーションメニューでリンクが機能しない
- 19. 一見不可能な一見単純なCSSレイアウトですか?
- 20. 場所api Webサービスで多くのリクエストには、別の方法で行うことは可能ですか?
- 21. 複雑なAPIと単純なAPIエンドポイント
- 22. 単一のSQLステートメント - それは可能ですか?
- 23. GambasでWebスクレイピングが可能ですか?
- 24. パスリスト型のWeb API
- 25. IdentityServer4のあるweb apiから別のWeb apiにaccess_tokenをリレーすることは可能ですか?
- 26. Web Apiが他のエンドポイントの結果を返す
- 27. Google+ APIでサークルカウントが可能ですか?
- 28. 最新のフロントエンドWebプロジェクトのソースコードを単一のhtmlファイルにパックすることは可能ですか?
- 29. Web APIからHttpContext.Current.Sessionにアクセスすることは可能です
- 30. WCF Web APIプレビュー6:いいえ 'MediaTypeFormatter'が利用可能です
たとえ動作しても、どのようにしてコードを再利用できますか? – Aliostad
コントローラのコードを減らしたい。 Command( 'HandleNewUserCommand(NewUserCommand){}、HandleUserPasswordChangeCommand(UserPasswordChangeCommand){} 'など)の各サブクラスの定型メソッドの代わりに、単一の' HandleCommand'メソッドは、リフレクションとIoCを使用してコマンドを適切なドメインロジック。 – smalltowndev