2017-07-01 11 views
5

मैं एक वेब अनुप्रयोग में ConfigureServices से कॉपी किया मैं, निर्माण कर रहा हूँ जहाँ मैं वेब से दूर स्थानांतरित करने और केवल एक सांत्वना अनुप्रयोग या सेवा का उपयोग कोशिश कर रहा हूँ:एक .NET कोर कंसोल एप्लिकेशन में एक स्कोप्ड सेवा उदाहरण कैसे प्रबंधित किया जाता है?

serviceCollection.AddScoped<IDbConnection, SqlConnection>(c => new SqlConnection(App.Configuration.GetConnectionString("DefaultConnection"))); 

सांत्वना अनुप्रयोग ठीक काम करता है, लेकिन मैं सोच रहा हूं कि कनेक्शन का जीवनकाल कैसे संभाला जाता है। कनेक्शन कब बंद हो जाता है और डिस्पोजेड किया जाता है? या यह एक क्षणिक उदाहरण के समान व्यवहार करता है, और मुझे इसे स्वयं का निपटान करना चाहिए?

उत्तर

6

जब आप IServiceProviderIServiceCollection से (BuildServiceProvider विधि) का निर्माण और आप IDbConnection हल करने IServiceProvider के इस उदाहरण का उपयोग आप IDbConnection हर बार की एक ही उदाहरण मिल जाएगा। दायरा IServiceProvider से जुड़ा हुआ है। नई गुंजाइश बनाने के लिए कंटेनर IServiceScopeFactory से हल करने और इसका इस्तेमाल IServiceProvider कि स्कोप वाला बनाने के लिए की जरूरत है: जब गुंजाइश निपटान किया जाता है

using (var scope = scopeFactory.CreateScope()) 
{ 
    var scopedConnection = scope.ServiceProvider.GetRequiredService<IDbConnection>();  
} 

कनेक्शन निपटारा किया जाएगा।

एएसपी कोर स्कॉप्स में आपके लिए मिडलवेयर द्वारा प्रबंधित किया जाता है जो नए दायरे को बनाता है और फिर इस वेब अनुरोध के भीतर नियंत्रक और सबकुछ हल करने के लिए इस दायरे से जुड़े IServiceProvider का उपयोग करता है। कंसोल एप्लिकेशन में आपको अपने आप को स्कॉप्स प्रबंधित करने की आवश्यकता है।

+0

एक सेवा संग्रह के साथ एक गुंजाइश कारखाना कैसे जुड़ा हुआ है? –

+0

'IServiceScopeFactory' स्वचालित रूप से ढांचे द्वारा' IServiceCollection' में पंजीकृत है, इसलिए आपको इसे मैन्युअल रूप से पंजीकृत करने की आवश्यकता नहीं है। बाद में आप इसे 'IServiceProvider' से आसानी से हल कर सकते हैं। –

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