5

受け入れヘッダーのコンテンツネゴシエーションを使用してバージョンベースの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で渡す必要があります。

これを行う方法はありますか?

ありがとうございます!

+3

次のようになります。http://stackoverflow.com/questions/21306305/binding-abstract-action-parameters-in-webapi –

+0

おかげで@DanielStackenland !! 投稿されたJSONを識別するためのproductTypeのような共通フィールドはありません。 また、必要に応じて後でバージョン管理されるAPIの学生のような約50〜70のクラスがあります。 –

+0

とにかくAbstractStudentControllerの目的は何ですか? StudentV1Controller(およびV2)がAbstractBaseControllerを継承し、StudentV1(およびV2)をパラメータとして使用するのはなぜですか? –

答えて

0

貼り付けたコードに基づいて、AbstractStudentController genericとすることができます。 抽象を宣言するAPIはすべてのAPIバージョンで実装する必要があり、ジェネリックで型を定義できるためです。 StudentV2Controllerの実装からパッチが抜けていますが、抽象的な宣言がされているので、あなたの説明から何かを逃していないことを願っています。 StudentV1ControllerからStudentV2Controllerを派生させたかったのですか?

public abstract class AbstractBaseController : ApiController 
{ 
    // common methods for all api 
} 

public abstract class AbstractStudentController<StudentType> : AbstractBaseController 
{ 
    // common methods for Student related API'sample 

    public abstract Post(StudentType student); 
    public abstract Patch(StudentType student); 
} 

public class StudentV1Controller : AbstractStudentController<StudentV1> 
{ 
    public override Post([FromBody]StudentV1 student) // student should be instance of StudentV1 from JSON 
    { 
     // To Do: Insert V1 Student 
    } 

    public override Patch([FromBody]StudentV1 student) // student should be instance of StudentV1 from JSON 
    { 
     // To Do: Patch V1 Student 
    } 
} 

public class StudentV2Controller : AbstractStudentController<StudentV2> 
{ 
    // 
    public override Post([FromBody]StudentV2 student) // student should be instance of StudentV2 from JSON 
    { 
     // To Do: Insert V2 Student 
    } 
} 
関連する問題