2014-04-11 10 views
5

मैं वेब एपीआई v2 का उपयोग कर रहा हूं और मेरे पास कुछ मॉडल हैं जिन्हें मुझे सीआरयूडी संचालन करने की आवश्यकता है। उदाहरण के लिए, मेरे पास Allergy मॉडल और Prescription मॉडल है। एप्लिकेशन में ही मेरे पास व्यूमोडेल हैं जो उनके उपयुक्त मॉडल में बदल सकते हैं, लेकिन सादगी के लिए चलो बस कहना है कि मैं सीधे वेब एपीआई नियंत्रक में मॉडल लेता हूं।जेनेरिक वेब एपीआई नियंत्रक

तो कुछ इस तरह:

public class PrescriptionsController 
    { 
     public HttpResponseMessage Put(Prescription model) 
     { 
       // saved to the DB 
     } 

     ... (other CRUD operations) 
    } 

मैं भी है Allergy मॉडल के लिए एक ही:

public class AllergiesController 
    { 
     public HttpResponseMessage Put(Allergy model) 
     { 
       // saved to the DB 
     } 

     ... (other CRUD operations) 
    } 

दोनों मॉडल अलग गुण होते हैं लेकिन ठीक उसी तरह से नियंत्रित किया जाता - वास्तव में मेरे पास है लगभग 3 अन्य मॉडल जिन्हें प्रत्येक सीआरयूडी ऑपरेशन के लिए बिल्कुल वही तरीके से संभाला जाता है। मुझे 5 अलग-अलग अंतराल होने से नफरत है जो मूल रूप से कॉपी और चिपकाए गए कोड हैं।

मैं एक सामान्य नियंत्रक इन मॉडलों के सभी संभाल करने बना सकते हैं:

तो मेरे सवाल है? MyCommonController<T> की तरह कुछ? (लेकिन पाठ्यक्रम के बेहतर नाम के साथ!) क्या वेब एपीआई उस परिदृश्य में रूटिंग को संभाल सकता है? क्या यह भी एक अच्छा विचार है?

+0

मुझे लगता है कि आप इसे विभिन्न तरीकों से प्राप्त कर सकते हैं .. रूटिंग द्वारा। मैंने कोशिश नहीं की है, लेकिन देखेंगे। – Guanxi

+0

संभव लगता है। यहां इसके बारे में एक चर्चा है: http://stackoverflow.com/questions/12077361/generic-webapi-controller – Trisk

उत्तर

7

अंत में मैंने एक सामान्य नियंत्रक का प्रयास नहीं किया। ऐसा लगता है कि रूटिंग के साथ कुछ हुप्स के माध्यम से कूदना संभव हो सकता है।

हालांकि, तथ्य यह है कि काम करने के लिए इसे संशोधित करने में संशोधन बहुत जटिल था, जिस तरह से मुझे लाभ मिलेगा। मैं चीजों को सरल रखना चाहता था। तो मैं बस के बजाय एक सामान्य आधार वर्ग बनाया:

class MyBaseController<TModel> : ApiController 
{ 
    public TModel Get(int id) { ... } 
} 

और इसे से प्रत्येक प्रकार इनहेरिट था:

class PrescriptionsController : MyBaseController<Prescription> { } 

और उस आकर्षण की तरह काम किया, मार्ग या कुछ भी साथ गड़बड़ करने के लिए नहीं था। यह स्पष्ट करता है कि क्या हो रहा है और यह काफी रखरखाव योग्य है।

संबंधित मुद्दे