2011-03-01 7 views
14

एमवीसी 3 में उन्होंने एक निर्भरता रिजॉल्वर जोड़ा जो मैं उपयोग कर रहा था। किसी को जवाब देने पर किसी ने टिप्पणी की है कि आपको निनजेक एमवीसी 3 प्लगइन का उपयोग करना चाहिए।एमवीसी 3 निर्भरता रिजॉल्वर या निनजेक एमवीसी प्लगइन?

तो मेरा सवाल यह है कि इसे एक में निर्मित क्यों करें? यदि यह तरीका है कि आप इसे कैसे सेट अप करते हैं?

Question

तो ऊपर सवाल है कि मैं जवाब के लिए लिंक है।

उत्तर

13

Ninject.Web.MVC एक्सटेंशन (या Ninject.MVC3 NuGet पैकेज) भी एक निर्भरता रिज़ॉल्वर आंतरिक रूप से उपयोग करते हैं। तो मूल रूप से यह एक ही तंत्र का उपयोग कर रहा है। लेकिन अपने निर्भरता रिज़ॉल्वर को लागू करने के बजाय एक्सटेंशन का उपयोग करने के कई कारण हैं:

  1. एक निर्भरता रिज़ॉल्यूवर को क्यों कार्यान्वित करना है जब पहले से ही एक एक्सटेंशन कर रहा है? दूसरों की तुलना में एक ही कार्यान्वयन का उपयोग करना आपको समस्या होने पर समर्थन देना अधिक आसान बनाता है। इसके अलावा एक ही कार्यान्वयन का उपयोग करके जितना अधिक स्थिर हो जाता है। (बिंदु 4 देखें)।
  2. एक्सटेंशन केवल एक निर्भरता रिज़ॉल्वर से अधिक है। एक्सटेंशन के साथ आने वाली सभी सुविधाओं की सूची के लिए http://www.planetgeek.ch/2010/11/13/official-ninject-mvc-extension-gets-support-for-mvc3/ देखें।
  3. डिफ़ॉल्ट रूप से अनुरोध समाप्त होने के बाद ऑब्जेक्ट इनरक्वैस्टस्कोप की तेज़ी से निष्क्रियता के लिए समर्थन जोड़ता है। यह उन अनुप्रयोगों को रोकता है जो भारी लोड वाले अनुप्रयोगों को आउटऑफमेमरी अपवाद में चलाते हैं।
  4. आपकी पोस्ट में निर्भरता रिज़ॉल्वर और दोनों के ऊपर एक समस्या है। भारी परिस्थितियों में कुछ स्थितियों में आपका आवेदन दुर्घटनाग्रस्त हो जाएगा और एप्लिकेशन को फिर से शुरू होने तक केवल पीले रंग के पृष्ठों को प्रदर्शित करेगा। मैं उन सभी प्रश्नों का उत्तर देना पसंद नहीं करता जो केवल भविष्य में आएंगे क्योंकि एक दोषपूर्ण निर्भरता रिज़ॉल्वर का उपयोग किया जाता है। GetServices
  5. में कम से कम एक। ToList() को InRequestScope के लिए समर्थन को विनियमित 2.4 में हटा दिया जाएगा ताकि सिस्टम लक्ष्य पर निर्भरता को दूर किया जा सके। बिल्ड लक्ष्य की संख्या को कम करने के लिए। यह एक तोड़ने वाला बदलाव है। लेकिन वेब एक्सटेंशन में से किसी एक के आधार पर परियोजनाओं को इसे फिर से चलाने के लिए केवल एक बहुत ही कम परिवर्तन की आवश्यकता होगी।InRequestScope अभी भी इन एक्सटेंशन में से किसी एक का उपयोग करके परियोजनाओं के लिए उपलब्ध होगा। कस्टम कार्यान्वयन को स्वयं को समर्थन जोड़ना होगा।
+0

@ रीमो ग्लोर - वेब.एमवीसी एक्सटेंशन और Ninject.MVC3 के बीच क्या अंतर है? – chobo2

+0

यह वही है। हमने NuGet पैकेज Ninject.MVC3 का नाम रखा क्योंकि यह पहले अस्तित्व में था। –

+0

@ रेमो ग्लोर - तो यह वही बात है? – chobo2

15

एएसपी.नेट एमवीसी 3 एक निर्भरता इंजेक्शन सेवा प्रदान करता है जो लागू करने के लिए आप जो भी निर्भरता संकल्प चुनते हैं। निनजेक एमवीसी 3 प्लगइन अपने फ़ंक्शन में बहुत आसान है क्योंकि यह सब करना चाहिए System.Web.Mvc.IDependencyResolver में परिभाषित प्रकार-रिज़ॉल्यूशन विधियों को कार्यान्वित करना और अनुरोधित प्रकार को वापस करने के लिए उचित निंजा विधियों को कॉल करना।

चाहे आप अपना खुद का आईडी निर्भरता रीसोलवर का उपयोग करना चुनते हैं और इसे निनजेक्ट (या किसी अन्य निर्भरता इंजेक्शन फ्रेमवर्क) पर मैप करते हैं, या आप स्वतंत्र रूप से उपलब्ध निंजा एमवीसी 3 प्लगइन का उपयोग करना चुनते हैं, ज्यादातर एक मामूली भेद है।

यहां एक पूर्ण-कार्यात्मक उदाहरण है जो हाथ से लुढ़का हुआ, निनजेक्ट-संगत आईडी निर्भरता रीसोलवर जैसा दिख सकता है। Ninject MVC 3 प्लगइन मौलिक बहुत समान होगा:

public class NinjectDependencyResolver : IDependencyResolver 
{ 
    private readonly IKernel _kernel; 

    public NinjectDependencyResolver(IKernel kernel) { 
     _kernel = kernel; 
    } 

    public object GetService(Type serviceType) { 
     return _kernel.TryGet(serviceType, new IParameter[0]); 
    } 

    public IEnumerable<object> GetServices(Type serviceType) { 
     return _kernel.GetAll(serviceType, new IParameter[0]); 
    } 
} 

यहां प्रमुख मुद्दा है कि ASP.NET MVC एक पूर्ण निर्भरता इंजेक्शन ढांचे प्रदान नहीं करता है; यह केवल एएसपी.नेट एमवीसी अनुरोध पाइपलाइन (नियंत्रक संकल्प, दृश्य संकल्प, आदि) में विशिष्ट बिंदुओं पर एक आईओसी कंटेनर (यानी निंजा) के माध्यम से एक आवश्यक प्रकार के उदाहरण को पुनः प्राप्त करने के लिए आवश्यक परत प्रदान करता है।

नोट: यदि मैंने उपयोग की जाने वाली शब्दावली में से कोई भी सटीक नहीं है, तो कृपया मुझे सूचित करें।

+0

यह मेरे पास अब बहुत कुछ दिखता है (अन्य पोस्ट देखें)। मैंने सुना (या मुझे लगता है कि मैंने सुना है) कि एमवीसी प्लगइन के बिना इसे स्वयं ऐसा करने से निबर्ननेट का उपयोग करते समय सत्रों को मारना नहीं होगा। – chobo2

+0

@ chobo2 मुझे वास्तव में nHibernate या जिस समस्या का आप वर्णन कर रहे हैं उसके साथ कोई अनुभव नहीं मिला है, इसलिए मैं विशेष रूप से उससे बात नहीं कर सकता। : [ –

+0

@ chobo2, शायद आप जो संदर्भ दे रहे हैं वह निनजेक्ट का 'वनपियर रिवेस्ट मॉड्यूल' है, अनुरोध के समाप्त होने पर यह कुछ भी इनवेक्वेस्टस्कोप को बाध्य कर देगा। किसी अन्य एंडरक्वैस्ट हैंडलर चलाने से पहले यह निष्पादित भी होगा। दुर्भाग्यवश यह करने से आप इसे होने से नहीं रोकेंगे। – Vadim