2016-11-28 12 views
11

ASP.NET कोर IServiceCollection पर विस्तार तरीकों का उपयोग करता निर्भरता इंजेक्शन स्थापित करने के लिए, तो जब एक प्रकार की जरूरत है कि यह उपयुक्त विधि का उपयोग करता एक नया उदाहरण बनाने के लिए:.NET कोर निर्भरता इंजेक्शन वाले उदाहरण कब निपटाए जाते हैं?

  • AddTransient<T> - एक प्रकार है कि फिर से प्रत्येक बनाई गई है कहते हैं समय से अनुरोध किया गया है।
  • AddScoped<T> - अनुरोध के दायरे के लिए रखा गया एक प्रकार जोड़ता है।
  • AddSingleton<T> - एक प्रकार को जोड़ता है जब इसे पहले अनुरोध किया जाता है और इसे पकड़ता रहता है।

मैं प्रकार है कि IDisposable को लागू करने और है कि समस्याओं अगर वे निपटारा नहीं कर रहे हैं कारण होगा है - उन पैटर्न में से प्रत्येक में जब Dispose वास्तव में कहा जाता है?

क्या मुझे कुछ भी जोड़ने की आवश्यकता है (जैसे अपवाद हैंडलिंग) यह सुनिश्चित करने के लिए कि इंस्टेंस हमेशा निपटाया जाता है?

उत्तर

16

हल की गई वस्तुओं में उनके कंटेनर के रूप में एक ही जीवनकाल/निपटान चक्र होता है, तब तक जब तक आप using कथन या .Dispose() विधि का उपयोग करके कोड में क्षणिक सेवाओं का मैन्युअल रूप से निपटान नहीं करते हैं।

एएसपी.नेट कोर में आपको एक स्कॉप्ड कंटेनर मिलता है जो प्रति अनुरोध तत्काल होता है और अनुरोध के अंत में निपटा जाता है। इस समय, इस कंटेनर द्वारा बनाए गए स्कोप्ड और क्षणिक निर्भरताओं को भी निपटान किया जाएगा (यदि वे IDisposable इंटरफ़ेस लागू करते हैं), जिसे आप स्रोत कोड here पर भी देख सकते हैं। पैरेंट कंटेनर निपटारा हो जाता है

public void Dispose() 
{ 
    lock (ResolvedServices) 
    { 
     if (_disposeCalled) 
     { 
      return; 
     } 
     _disposeCalled = true; 
     if (_transientDisposables != null) 
     { 
      foreach (var disposable in _transientDisposables) 
      { 
       disposable.Dispose(); 
      } 

      _transientDisposables.Clear(); 
     } 

     // PERF: We've enumerating the dictionary so that we don't allocate to enumerate. 
     // .Values allocates a ValueCollection on the heap, enumerating the dictionary allocates 
     // a struct enumerator 
     foreach (var entry in ResolvedServices) 
     { 
      (entry.Value as IDisposable)?.Dispose(); 
     } 

     ResolvedServices.Clear(); 
    } 
} 

Singletons निपटारा हो, आम तौर पर अर्थ है कि जब आवेदन बंद हो जाता है।

टी एल; डॉ: आवेदन स्टार्टअप के दौरान जब तक आप scoped का दृष्टांत नहीं है/क्षणिक सेवाएं (app.ApplicationServices.GetService<T>() का प्रयोग करके) और अपनी सेवाओं को सही ढंग से डिस्पोजेबल इंटरफ़ेस को लागू (जैसे pointed in MSDN) वहाँ कुछ भी नहीं आप की देखभाल की जरूरत है।

पैरेंट कंटेनर Configure(IApplicationBuilder app) विधि के बाहर अनुपलब्ध है जब तक कि आप इसे बाहर करने योग्य बनाने के लिए कुछ मजेदार चीजें नहीं करते (जिसे आपको वैसे भी नहीं करना चाहिए)।

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

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