2012-02-29 15 views
7

से क्यों नहीं आते हैं एएसपीनेट एमवीसी 4 में आपके डेटा मॉडल पर सीआरयूडी कार्यक्षमता को उजागर करने के लिए एक वेब एपीआई की यह 'नई' अवधारणा है। इन नियंत्रकों के लिए बेस क्लास DataController है जो ApiController से निकला है।एएसपीनेट वेब एपीआई नियंत्रक आईसींट्रोलर

दुर्भाग्य से इस ApiControllerIController से निकाले जाते हैं नहीं है जो समस्याग्रस्त है के बाद से इन अनुरोधों को अपने सामान्य कस्टम नियंत्रक कारखाने के माध्यम से नियंत्रित नहीं किया जा सकता, क्योंकि ये IController का एक उदाहरण वापसी करने वाले हैं।

किसी को भी इस के पीछे कारण पता है के रूप में मैं तुम क्यों के रूप में यह हर एक नियंत्रक का दृष्टांत करने में सक्षम नहीं है, क्योंकि यह आपके कस्टम नियंत्रक कारखाने टूट जाता है अपने MVC परियोजना में एक नियंत्रक कि IController से निकाले जाते हैं नहीं है होता नहीं देख सकते हैं आपकी परियोजना में

संक्षेप में, इस विरासत के कारण आप निर्भरता को इंजेक्ट करने के लिए अपने डी कंटेनर का उपयोग करने में असमर्थ हैं।

उत्तर

7

मैंने माइक्रोसॉफ्ट को भी यही प्रश्न भेजा और एइलॉन लिपटन (उस के लिए thx) द्वारा निम्नलिखित उत्तर प्राप्त किया:

छोटी कहानी यह है कि एएसपी.नेट एमवीसी और एएसपी.नेट वेब एपीआई एक ही डिजाइन अवधारणाओं (निर्भरता इंजेक्शन, कस्टम कार्यान्वयन में प्लग करने के लिए कई इंटरफेस, और आसान टेस्टेबिलिटी) साझा करते हैं, वे अलग-अलग निर्माण करते हैं अंतर्निहित HTTP ढेर। एमवीसी सिस्टम पर बनाता है। वेब स्टैक जिसे 10 से अधिक वर्षों से एएसपी.नेट में इस्तेमाल किया गया है। वेब एपीआई नई System.Net.Http स्टैक पर बनाता है जो होस्टिंग (आईआईएस + कस्टम होस्ट + यूनिट टेस्ट होस्ट) के साथ-साथ बेहतर टेस्टेबिलिटी और एक्स्टेंसिबिलिटी के लिए अधिक लचीलापन प्रदान करता है। यदि आप IController और IHttpController की तुलना करते हैं तो आप देखेंगे कि कोई सिस्टम का उपयोग करता है और ऊपर स्टैक को ऊपर और नीचे करता है, और दूसरा इसका उपयोग नहीं करता है।

इनमें से किसी भी के बावजूद, एएसपी.नेट स्टैक - एमवीसी, वेब फॉर्म, वेब एपीआई, वेब पेजेस (और रेजर) पर निर्मित सभी प्रौद्योगिकियां - एक आवेदन के भीतर-साथ काम करने के लिए जारी रहेगी आप अपने आवेदन के प्रत्येक भाग को बनाने के लिए सही टुकड़े चुनने के लिए। जबकि प्रत्येक टुकड़े के भीतर घटकों के व्यक्तिगत कार्यान्वयन अलग-अलग नहीं होते हैं, वे प्रत्येक को समान सेवाओं तक पहुंचाया जा सकता है, जैसे कि निर्भरता इंजेक्शन सिस्टम, लॉगिंग टूल्स, डेटा प्रदाता, और बहुत कुछ।

एक बार जब हम इस विषय पर हमारी पोस्ट प्रकाशित करते हैं तो मुझे लगता है कि चीजों को और स्पष्ट करना चाहिए।

1

एएसपी.Net वेबएपीआई के साथ डी करने के लिए आपको अपने डी कंटेनर के लिए निर्भरता रिज़ॉल्यूवर बनाना होगा।

Ninject

के लिए निम्न कार्य
public class NinjectDependencyResolver : System.Web.Http.Services.IDependencyResolver 
{ 
    private static IKernel m_Kernel; 

    public NinjectDependencyResolver() 
    { 
     m_Kernel = new StandardKernel(); 
    } 

    public NinjectDependencyResolver(IKernel myKernel) 
    { 
     m_Kernel = myKernel; 
    } 

    public object GetService(Type serviceType) 
    { 
     return m_Kernel.TryGet(serviceType); 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     return m_Kernel.GetAll(serviceType); 
    } 
} 
तो यह बाँध Global.ascx फ़ाइल में

का उपयोग कर:

GlobalConfiguration.Configuration.ServiceResolver.SetResolver(new NinjectDependencyResolver(yourKernel)); 

इस MVC3 निर्भरता इंजेक्शन के लिए इसी तरह (लेकिन काफी समान नहीं) है

+1

मैंने पहले अपने स्वयं के नियंत्रक कारखाने का उपयोग किया है, इस कक्षा को अभी भी वेबपी नियंत्रकों के लिए भी बुलाया जाता है। मैं निर्भरता रिसेल्वर को कॉल करने के लिए आवेदन नहीं प्राप्त कर सकता। सभी अनुरोध मेरे स्वयं के नियंत्रक के माध्यम से जाते हैं (इस कस्टम फैक्ट्री को हटाने से वह नहीं बदलता है)। – thekip

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