5

Wir möchten versionbasierte API mit Inhaltsverhandlung in akzeptieren Header erreichen.ASP.NET-Web-API-Vertrag Versionierung

Wir sind in der Lage, für Controller & API-Methoden mit einigen Vererbung und Erweiterung der Standard-HTTP-Selektor zu erreichen.

Controller-Vererbung folgenden Beispielcode erreicht Verwendung

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

Wir über Architektur geschaffen haben weniger Code mit einer Änderung in einer API in der Version, sagen, wenn Version 1 verfügt über 10 API-Methoden und gibt es eine Änderung zu tun Methode als es in Version 2 Code verfügbar sein sollte, ohne andere 9 zu ändern (sie werden von Version 1 geerbt).

Jetzt liegt das Hauptproblem in der Vertragsversionierung, da wir keine Instanz eines abstrakten Studenten instantiieren können. Wenn jemand JSON in API Version 1 veröffentlicht, sollte die Instanz von StudentV1 in Methoden und dieselbe in Version 2 übergeben werden.

Gibt es eine Möglichkeit, dies zu erreichen?

Vielen Dank im Voraus!

+3

sieht wie folgt aus: http://stackoverflow.com/questions/21306305/binding-abstract-action-parameters-in-webapi –

+0

Dank @DanielStackenland !! Wir haben kein allgemeines Feld wie productType, um den geposteten JSON zu identifizieren. Wir werden auch etwa 50 - 70 solcher Klassen wie Studenten in API haben, die später bei Bedarf versioniert werden. –

+0

Was ist der Zweck von AbstractStudentController überhaupt? Warum lässt du nicht einfach den StudentV1Controller (und V2) den AbstractBaseController erben und StudentV1 (und V2) als Parameter verwenden? –

Antwort

0

Basierend auf Ihrem eingefügten Code könnten Sie AbstractStudentController generisch machen. Da diese APIs, die Sie als Abstract deklarieren, in jeder API-Version implementiert sein müssen, können Sie den Typ mit dem generischen Typ definieren. Ich hoffe, ich verpasse nichts von Ihrer Beschreibung, weil Patch von Ihrer Implementierung in StudentV2Controller fehlt, aber als abstrakt deklariert wird. Möchten Sie StudentV2Controller von StudentV1Controller ableiten?

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