5

Kabul başlığında içerik anlaşması kullanarak sürüm tabanlı API'ye ulaşmak istiyoruz.ASP.NET Web API Sözleşme Sürümleri

Bazı kalıtım ve varsayılan HTTP seçiciyi genişletme denetleyicisi & API yöntemleri için elde edebiliyoruz.

Kontrolör miras Biz sürümünde değişiklik ile daha az kod yapmak mimarisi yukarıda oluşturduk

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

, sürüm 1 10 API yöntemini varsa söylemek ve bir API bir değişiklik olduğunda, aşağıdaki örnek kodu kullanarak elde edilir yöntem, diğer 9'u değiştirmeden sürüm 2 kodunda bulunmalıdır (sürüm 1'den devralınır). Şimdi, karşılaştığımız temel sorun, soyut bir öğrencinin bir örneğini başlatamadığımız için sözleşme versiyonudur. Birisi, JSON'a API 1 sürümü gönderdiğinde, StudentV1'in 1 sürümü, yöntemlerde geçirilmeli ve 2. sürümde aynı olmalıdır.

Bunu başarmanın bir yolu var mı?

Şimdiden teşekkürler!

+3

bu gibi görünüyor: http://stackoverflow.com/questions/21306305/binding-abstract-action-parameters-in-webapi –

+0

Teşekkür @DanielStackenland !! Yayınlanmış JSON'u tanımlamak için productType gibi yaygın bir alanımız yok. Ayrıca, gerektiğinde daha sonra kullanılacak olan, API'daki öğrenci gibi yaklaşık 50 - 70 dersimiz olacaktır. –

+0

Her neyse, AbstractStudentController'ın amacı nedir? Neden sadece StudentV1Controller'ın (ve V2) AbstractBaseController'ı miras bırakıp StudentV1 (ve V2) parametresini kullanmasına izin vermiyorsunuz? –

cevap

0

Yapıştırılan kodunuza dayanarak, AbstractStudentController jenerik yapabilirsiniz. Özeti bildirdiğiniz API'lar her API sürümünde uygulanmalıdır ve türünü genel ile tanımlayabilirsiniz. Umarım açıklamanızdan bir şey kaçırmıyorumdur, çünkü Yama, ApplicationV2Controller uygulamasındaki uygulamanızdan eksiktir, ancak özet olarak beyan edilmiştir. StudentV1Controller'dan StudentV2Controller çıkarmak mı istiyorsunuz?

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