5

हम स्वीकृति हेडर में सामग्री वार्ता का उपयोग कर संस्करण आधारित एपीआई प्राप्त करना चाहते हैं।एएसपी.नेट वेब एपीआई अनुबंध संस्करण

हम कुछ विरासत के साथ नियंत्रक & एपीआई विधियों और डिफ़ॉल्ट HTTP चयनकर्ता को विस्तारित करने में सक्षम हैं।

नियंत्रक विरासत निम्नलिखित नमूना कोड का उपयोग कर हासिल की है,

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

हम संस्करण में परिवर्तन के साथ कम कोड करने के लिए वास्तुकला ऊपर बनाया है, का कहना है कि अगर संस्करण 1 10 एपीआई तरीकों है और एक एपीआई में कोई परिवर्तन होता है अन्य 9 को संशोधित किए बिना संस्करण 2 कोड में यह उपलब्ध होना चाहिए (वे संस्करण 1 से विरासत में हैं)।

अब, मुख्य समस्या का सामना हम कर रहे हैं अनुबंध संस्करण में है क्योंकि हम एक अमूर्त छात्र के उदाहरण को तत्काल नहीं कर सकते हैं। जब कोई व्यक्ति एपीआई संस्करण 1 पर जेएसओएन पोस्ट कर रहा है तो छात्रवृत्ति 1 के उदाहरण को विधियों में और संस्करण 2 में समान रूप से पारित किया जाना चाहिए।

क्या यह हासिल करने का कोई तरीका है?

अग्रिम धन्यवाद !!

+3

इस तरह लग रहा है: http://stackoverflow.com/questions/21306305/binding-abstract-action-parameters-in-webapi –

+0

धन्यवाद @DanielStackenland !! हमारे पास पोस्ट JSON की पहचान करने के लिए उत्पाद टाइप जैसी कोई सामान्य फ़ील्ड नहीं है। इसके अलावा, हमारे पास लगभग 50 - 70 ऐसे वर्ग होंगे जैसे एपीआई में छात्र जो बाद में संस्करणित किए जाएंगे। –

+0

वैसे भी सारस्ट्रुंट कंट्रोलर का उद्देश्य क्या है? आप छात्रवृत्ति V1Controller (और V2) को सारबेसबेस नियंत्रक का उत्तराधिकारी क्यों नहीं देते हैं और छात्रवृत्ति (और V2) पैरामीटर के रूप में उपयोग करते हैं? –

उत्तर

0

अपने चिपकाए गए कोड के आधार पर आप सार तत्व स्टंट्रोलर जेनेरिक बना सकते हैं। क्योंकि उन एपीआई जिन्हें आप अमूर्त घोषित करते हैं उन्हें प्रत्येक एपीआई संस्करण में कार्यान्वित किया जाना चाहिए, और आप जेनेरिक के साथ प्रकार को परिभाषित कर सकते हैं। मुझे आशा है कि मुझे आपके विवरण से कुछ याद नहीं आ रहा है, क्योंकि छात्रवृत्ति नियंत्रक में आपके कार्यान्वयन से पैच गुम है, लेकिन इसे अमूर्त घोषित किया गया है। क्या आप 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 
    } 
} 
संबंधित मुद्दे