受け入れヘッダーのコンテンツネゴシエーションを使用してバージョンベースのAPIを実現したいと考えています。ASP.NET Web APIの契約バージョン管理
コントローラー&のAPIメソッドを継承し、デフォルトのHTTPセレクターを拡張することができます。
コントローラの継承は我々は、バージョンの変化に少ないコードを実行するためにアーキテクチャ上で作成したバージョン1が10のAPIメソッドを持っており、1つのAPIに変更がある場合は、言う
public abstract class AbstractBaseController : ApiController
{
// common methods for all api
}
public abstract class AbstractStudentController : AbstractBaseController
{
// common methods for Student related API'sample
public abstract Post(Student student);
public abstract Patch(Student student);
}
public class StudentV1Controller : AbstractStudentController
{
public override Post([FromBody]Student student) // student should be instance of StudentV1 from JSON
{
// To Do: Insert V1 Student
}
public override Patch([FromBody]Student student) // student should be instance of StudentV1 from JSON
{
// To Do: Patch V1 Student
}
}
public class StudentV2Controller : AbstractStudentController
{
//
public override Post([FromBody]Student student) // student should be instance of StudentV2 from JSON
{
// To Do: Insert V2 Student
}
}
public abstract class Student
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class StudentV1 : Student
{
}
public class StudentV2 : Student
{
public string Email { get; set; }
}
、次のサンプルコードを使用して達成されますバージョン2のコードで利用可能でなければならず、他のバージョン9を変更しないでください(バージョン1から継承されています)。
私たちが直面している主な問題は、抽象的な学生のインスタンスをインスタンス化できないため、契約バージョン管理です。誰かがJSONをAPIバージョン1に送信する場合、StudentV1のインスタンスはメソッドと同じバージョン2で渡す必要があります。
これを行う方法はありますか?
ありがとうございます!
次のようになります。http://stackoverflow.com/questions/21306305/binding-abstract-action-parameters-in-webapi –
おかげで@DanielStackenland !! 投稿されたJSONを識別するためのproductTypeのような共通フィールドはありません。 また、必要に応じて後でバージョン管理されるAPIの学生のような約50〜70のクラスがあります。 –
とにかくAbstractStudentControllerの目的は何ですか? StudentV1Controller(およびV2)がAbstractBaseControllerを継承し、StudentV1(およびV2)をパラメータとして使用するのはなぜですか? –