2016-08-17 14 views
11
कॉन्फ़िगर करने के बाद सिंगलटन प्रारंभ

तो चलो कहते हैं कि मैं एक सिंगलटन वर्ग उदाहरण है कि मैं इस तरह डि में रजिस्टर डालते हैं:ASP.NET कोर डि

services.AddSingleton<IFoo, Foo>(); 

और मान लें कि Foo वर्ग अन्य निर्भरता की एक संख्या है चलो (ज्यादातर भंडार वर्ग जो डेटा को लोड करने की अनुमति देते हैं)।

मेरी वर्तमान समझ के साथ, Foo इंस्टेंस तब तक नहीं बनाया गया जब तक कि इसका पहले उपयोग नहीं किया जाता (पूछे जाने वाले)। क्या इस वर्ग को कन्स्ट्रक्टर के अलावा शुरू करने का कोई तरीका है? ConfigureServices() के बाद ठीक है? या प्रारंभिक कोड (डीबी से डेटा लोड करना) फू के कन्स्ट्रक्टर में किया जाना चाहिए?

(यह अच्छा होगा अगर इस वर्ग के पहली बार एक्सेस तेजी लाने के लिए पहली बार उपयोग करने से पहले अपने डेटा लोड कर सकते हैं)

+0

आप 'नया फू' बना सकते हैं() 'और इसे 'कॉन्फ़िगर सर्विसेज' विधि में पंजीकृत करें। –

उत्तर

14

यह अपने आप स्टार्टअप के दौरान करते हैं।

var foo = new Foo(); 
services.AddSingleton<IFoo>(foo); 

या "यह गर्म अप"

public void Configure(IApplicationBuilder app) 
{ 
    app.ApplicationServices.GetService<IFoo>(); 
} 

या वैकल्पिक रूप से

public void Configure(IApplicationBuilder app, IFoo foo) 
{ 
    ... 
} 

लेकिन यह सिर्फ गंदा लगता है और अपने डिजाइन के साथ अधिक एक समस्या है, अगर आप कुछ करना है कि आप shouldn कन्स्ट्रक्टर में नहीं है। क्लास इंस्टेंटेशन को तेज़ होना चाहिए और यदि आप इसके भीतर लंबे समय से चल रहे संचालन करते हैं, तो आप सर्वोत्तम प्रथाओं के समूह के खिलाफ तोड़ते हैं और इसके आसपास हैक करने के तरीकों की तलाश करने के बजाय अपने कोड बेस को दोबारा करने की आवश्यकता है

+3

लेकिन फिर मुझे फू की निर्भरताओं (सभी भंडारों और उनकी निर्भरताओं) के बारे में चिंता करने की ज़रूरत होगी। निश्चित रूप से करने योग्य, लेकिन एक ऐसे तरीके की तलाश है जो सिस्टम से लड़ती न हो। – pbz

+0

हां। आप आम तौर पर उन वर्गों को प्रारंभ करते हैं जिन्हें विशेष उपचार की आवश्यकता होती है, जैसे सेवा बस कनेक्शन आदि शुरू करना जो आप बूटअप समय के दौरान नहीं करना चाहते हैं। हालांकि आप वास्तव में क्या प्रयास करते हैं, हमें अधिक जानकारी की आवश्यकता होगी। मुझे संदेह है कि आप कन्स्ट्रक्टर में कुछ लंबे समय तक चल रहे ऑपरेशन करते हैं जो पूर्ण नहीं है। क्लास इंस्टेंटेशन कन्स्ट्रक्टर में कभी भी तेज और लंबे समय तक चलने वाला ऑपरेशन नहीं होना चाहिए। निस्संदेह आप कक्षा को 'कॉन्फ़िगर' में भी हल कर सकते हैं, लेकिन यह सिर्फ "गंदा" – Tseng

+0

हां लगता है, अपेक्षाकृत लंबा चल रहा है क्योंकि यह डेटा पुनर्प्राप्त करने के लिए डेटाबेस में जाता है (एकाधिक प्रश्नों के लिए लगभग 50ms)। चूंकि यह एक सिंगलटन है जो तर्क दे सकता है कि इससे कोई फर्क नहीं पड़ता कि यह कहां शुरू हुआ है। मुझे लगता है कि यह अब तक का सबसे अच्छा विकल्प है (बीटीडब्ल्यू आपने कॉन्फ़िगर() को गलत टाइप किया है। बस कोशिश की है और यह कॉन्फ़िगर() के लिए पैरा की सूची में IFoo जोड़ने के लिए काम करता है, इस तरह मुझे GetService <>() को कॉल करने की आवश्यकता नहीं है। धन्यवाद। – pbz