उत्तर

14

जैसा कि here उल्लिखित है, वेब एपीआई एक निर्भरता रिज़ॉल्वर का उपयोग करता है।

class StructureMapDependencyResolver : IDependencyResolver 
{ 
    public IDependencyScope BeginScope() 
    { 
     return this; 
    } 

    public object GetService(Type serviceType) 
    { 
     return ObjectFactory.GetInstance(serviceType); 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     return ObjectFactory.GetInstances(serviceType); 
    } 

    public void Dispose() 
    { 
    } 
} 

और अपने Global.asax.cs में, निर्भरता समाधानकर्ता रजिस्टर करने के लिए इस लाइन में शामिल हैं:

GlobalConfiguration.Configuration.DependencyResolver = new StructureMapDependencyResolver(); 
तरफ से

, नए वेब एपीआई बहुत आईओसी कंटेनर के साथ उपयोग करने के लिए आसान है।

मैंने अभी तक इसे नहीं देखा है, लेकिन मुझे लगता है कि BeginScope विधि जिसे मैंने खाली छोड़ दिया है, बच्चे के कंटेनरों के साथ उपयोग किया जा सकता है।

संपादित करें:

ऊपर कार्यान्वयन काम करता है महान; असल में मैं इसे वैकल्पिक रूप से पसंद करता हूं जिसे मैं आपको बताना चाहता हूं। यह किसी भी प्रकार को स्ट्रक्चर मैप की क्षमताओं के सर्वोत्तम तरीके से हल करेगा और कुछ भी गलत होने पर त्रुटियों को फेंक देगा। मुझे त्रुटियों को देखना पसंद है क्योंकि वे मुझे दिखाते हैं कि मैंने क्या किया है।

हालांकि, एपीआई उम्मीद करता है कि GetService कुछ गलत होने पर शून्य वापस आ जाएगा।

public object GetService(Type serviceType) 
{ 
    if (serviceType.IsAbstract || serviceType.IsInterface) 
     return ObjectFactory.TryGetInstance(serviceType); 
    else 
     return ObjectFactory.GetInstance(serviceType); 
} 

अंतर यह है कि TryGetInstance केवल कंटेनर में पंजीकृत प्रकार के लिए लग रहा है और अशक्त वापस आ जाएगी कुछ गलत हो जाता है, तो है: तो एपीआई के अनुरूप होने के, इस सिफारिश कार्यान्वयन है। serviceType.IsAbstract || serviceType.IsInterface को यह तय करने के लिए पर्याप्त चेक माना जाता है कि किस विधि का उपयोग करना है। मेरा मूल उत्तर सरल और सरल होना था, लेकिन @PHeiberg यहां टिप्पणियों में बताता है कि यह पूरी तरह से "सही" नहीं था। अब जब आपके पास ज्ञान है, जो भी सबसे अच्छा लगता है उसका उपयोग करें।

+0

StructureMap निर्भरता संकल्प संभाल नहीं है यहाँ की उम्मीद की तरह

मैं एक लेख वेब एपीआई में StructureMap कॉन्फ़िगर कैसे लिखा था। जेरेमी द्वारा इस उदाहरण और टिप्पणियों को देखें: http://ardalis.com/How-Do-I-Use-StructureMap-with-ASP.NET-MVC-3 – PHeiberg

+0

असल में यह काम करेगा। जेरेमी का कहना है कि 'TryGetInstance' केवल तभी हल हो जाता है जब' सेवा प्रकार 'स्पष्ट रूप से पंजीकृत हो। 'GetInstance' अभी भी उन प्रकारों को हल करेगा जो पंजीकृत नहीं हैं लेकिन ठोस हैं। – kelloti

+0

उदाहरणों का समाधान आपके कोड के साथ काम करेगा। हालांकि मैं प्रस्तावित "बेस्ट प्रैक्टिस" के रूप में पोस्ट किए गए लिंक की व्याख्या करता हूं, क्योंकि जेरेमी स्वयं [इसकी सिफारिश करता है] (http://codebetter.com/jeremymiller/2011/01/23/if-you-are-using-structuremap-with -mvc3-कृपया-पढ़ने के लिए इस /)। मुझे लगता है कि कंटेनर द्वारा टाइप हल करने योग्य नहीं है, तो अपवाद उत्पन्न करने के बजाय GetService विधि को शून्य वापस करना चाहिए। – PHeiberg

8

एएसपी.नेट वेब एपीआई रिलीज संस्करण निर्भरता रिज़ॉल्वर (IDependencyResolver इंटरफ़ेस का कार्यान्वयन) का उपयोग करता है और इसमें नई अवधारणा - निर्भरता क्षेत्र (IDependencyScope इंटरफ़ेस का कार्यान्वयन) भी शामिल है। IDependencyScope को सही ढंग से कार्यान्वित करना महत्वपूर्ण है - यदि सही तरीके से लागू किया गया है, तो यह निर्भरता स्कोप का निपटारा होने पर संसाधनों (स्कोप में बनाया गया) जारी करने की अनुमति देता है। और अनुरोध समाप्त होने पर इसका निपटारा किया जाता है।

पर निर्भरता सबसे अच्छा काम करता है जब कंटेनर नेस्टेड (या बच्चे) कंटेनर का समर्थन करता है। संरचना मैप इसे संस्करण 2.6.1 से करता है। Configuring StructureMap in ASP.NET WebAPI

तुम भी माइक वास्सन से लेख की जाँच कर सकते हैं:: Using the Web API Dependency Resolver

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