7

मैं सामान्य नेटी निर्भरता इंजेक्शन एक्सटेंशन के साथ एक महंगी कक्षा को तुरंत चालू करने के लिए सामान्य आलसी वर्ग का उपयोग करने की कोशिश कर रहा हूं। मैंने आईआरपीओ प्रकार पंजीकृत किया है, लेकिन मुझे यकीन नहीं है कि आलसी वर्ग का पंजीकरण कैसा दिखता है या यदि यह भी समर्थित है। समाधान के लिए मैं इस विधि का इस्तेमाल किया है http://mark-dot-net.blogspot.com/2009/08/lazy-loading-of-dependencies-in-unity.htmlकरता है .नेट कोर निर्भरता इंजेक्शन समर्थन आलसी <T>

config:

public void ConfigureService(IServiceCollection services) 
{ 
    services.AddTransient<IRepo, Repo>(); 
    //register lazy 
} 

नियंत्रक:

public class ValuesController : Controller 
{ 
    private Lazy<IRepo> _repo; 

    public ValuesController (Lazy<IRepo> repo) 
    { 
     _repo = repo; 
    } 

    [HttpGet()] 
    public IActionResult Get() 
    { 
     //Do something cheap 
     if(something) 
      return Ok(something); 
     else 
      return Ok(repo.Value.Get()); 
    } 
} 
+2

"एक महंगी कक्षा को तत्काल करने के लिए"। वह वर्ग महंगा क्यों बना रहा है? वर्गों को बनाने के लिए महंगा नहीं होना चाहिए। उनके रचनाकारों को [सरल] होना चाहिए (http://blog.ploeh.dk/2011/03/03/InjectionConstructorsshouldbesimple/), तेज़ और [विश्वसनीय] (http://blog.ploeh.dk/2011/03/04/ Composeobjectgraphswithconfidence /)। – Steven

+2

नहीं (भंडार/संदर्भ/...) वर्ग को अपने कन्स्ट्रक्टर में कनेक्शन खोलना चाहिए। –

+0

यह महंगा है जिसका मतलब है कि मैं नियंत्रण नहीं कर सकता। – ATerry

उत्तर

11

यहाँ एक और दृष्टिकोण है जो Lazy<T> के जेनेरिक पंजीकरण का समर्थन करता है, ताकि किसी भी प्रकार lazily हल किया जा सकता है।

services.AddTransient(typeof(Lazy<>), typeof(Lazier<>)); 

internal class Lazier<T> : Lazy<T> where T : class 
{ 
    public Lazier(IServiceProvider provider) 
     : base(() => provider.GetRequiredService<T>()) 
    { 
    } 
} 
+0

आलसी अनावश्यक रूप से भारी है, मैं इसके हल्के संस्करण की सिफारिश करता हूं। –

3

आप केवल एक कारखाने विधि है कि Lazy<IRepo> वस्तु बनाता है के लिए एक पंजीकरण जोड़ने करने की जरूरत है।

public void ConfigureService(IServiceCollection services) 
{ 
    services.AddTransient<IRepo, Repo>(); 
    services.AddTransient<Lazy<IRepo>>(provider => new Lazy<IRepo>(() => provider.GetService<IRepo>())); 
} 
+0

धन्यवाद, मैं उम्मीद कर रहा था कि सामान्य आलसी पंजीकरण होगा, लेकिन ऐसा प्रतीत नहीं होता है। कम से कम एम $ डी के साथ नहीं। – ATerry

+0

आप अपने आप से एक सामान्य सहायक विधि लिख सकते हैं। – VMAtm

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