मैं एएसपीनेट कोर एमवीसी 2.2 का उपयोग कर एक वेब ऐप विकसित कर रहा हूं, और मेरी Startup कक्षा में मैं MyService प्रकार का निर्भरता इंजेक्शन पंजीकृत कर रहा हूं, जैसे:

public void ConfigureServices(IServiceCollection services)
{
    //Inject dependency
    services.AddSingleton<MyService>();

    //...other stuff...
}

यह सही काम करता है। हालांकि, ऐप बंद होने से पहले कुछ सफाई संचालन करने के लिए, मुझे एप्लिकेशन शटडाउन के दौरान MyService का उदाहरण पुनर्प्राप्त करने की आवश्यकता है।

इसलिए मैंने ऐसा करने की कोशिश की - पहले मैंने अपनी स्टार्टअप कक्षा में IServiceProvider इंजेक्ट किया, इसलिए यह उपलब्ध है:

public Startup(IConfiguration configuration, IServiceProvider serviceProvider)
{
    ServiceProvider = serviceProvider;
    Configuration = configuration;
}

और फिर, कॉन्फ़िगर विधि में, मैंने शटडाउन को रोकने और OnShutdown विधि को कॉल करने के लिए ApplicationStopping ईवेंट के लिए एक हुक कॉन्फ़िगर किया:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApplicationLifetime applicationLifetime)
{
    //Register app termination event hook
    applicationLifetime.ApplicationStopping.Register(OnShutdown);

    //...do stuff...
}

अंत में, मेरी OnShutdown विधि में मैं अपनी निर्भरता प्राप्त करने और उसका उपयोग करने का प्रयास करता हूं:

private void OnShutdown()
{
    var myService = ServiceProvider.GetService<MyService>();
    myService.DoSomething(); //NullReference exception, myService is null!
}

हालांकि, जैसा कि आप कोड में टिप्पणी से देख सकते हैं, यह काम नहीं करता है: लौटाई गई निर्भरता हमेशा शून्य होती है। मुझसे यहां क्या गलत हो रहा है?

4
Master_T 12 सितंबर 2019, 10:41

1 उत्तर

सबसे बढ़िया उत्तर

मैं आपकी एप्लिकेशन सेवाओं को आपकी शटडाउन विधि में स्पष्ट रूप से पास करके इसे काम करने में सक्षम था।

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApplicationLifetime applicationLifetime)
{
    //Register app termination event hook
    applicationLifetime.ApplicationStopping.Register(() => OnShutdown(app.ApplicationServices));

     //...do stuff...
}


private void OnShutdown(IServiceProvider serviceProvider)
{
        var myService = serviceProvider.GetService<MyService>();
         myService.DoSomething();
}

इस बात का ध्यान रखें कि यह सिंगलटन सेवाओं के लिए काम करेगा - यदि आप स्कोप्ड सेवाओं का समाधान करना चाहते हैं तो आपको CreateScope() करना पड़ सकता है।

6
cl0ud 12 सितंबर 2019, 09:20