2012-12-26 32 views
8

कभी-कभी मैं खुद को ऐसे परिस्थिति में ढूंढता हूं जहां मुझे एक निश्चित स्थिति पूरी होने पर केवल एक सेवा को हल करने की आवश्यकता होती है। उदाहरण के लिए, कोई उपयोगकर्ता ईमेल या एसएमएस अधिसूचना भेजने का चयन कर सकता है। मैं उपयोगकर्ता द्वारा चुने गए विकल्पों के आधार पर ईमेल या एसएमएस सेवा को आलसी लोड करना चाहता हूं ताकि मुझे उन दोनों को लोड करने और संसाधनों को बर्बाद करने की आवश्यकता न हो (उदाहरण के लिए, उदाहरण के लिए, उपयोगकर्ता के लिए 10 विकल्प ...?)।कैसल विंडसर आलसी लोड सेवाएं

मेरे पास समस्या है जो मेरे बूटस्ट्रैप कोड के बाहर कंटेनर का उपयोग कर रहा है (मैं नहीं चाहता कि मेरा कोड वें कंटेनर पर निर्भर हो)। मुझे आलसी लोडिंग सेवाओं के लिए कंटेनर का उपयोग करने के आसपास एक रास्ता नहीं मिल रहा है (जब तक कि मैं हाथ से आवश्यक सेवाएं नहीं बनाता और मैन्युअल रूप से सभी डीआई करता हूं)। क्या यह ऐसी स्थिति है जहां नियमों को झुकाया जा सकता है या क्या ऐसा करने का एक बेहतर तरीका है?

उत्तर

5

यदि आप कैसल विंडसर 3.0 या नए का उपयोग कर रहे हैं, तो आप आलसी समाधान का उपयोग कर सकते हैं।

What's new in Windsor 3 for more details देखें।

पंजीकरण प्रक्रिया थोड़ा बदलती है (नया घटक लोडर पंजीकृत होना चाहिए)।

उसके बाद, आप केवल हमेशा के रूप में घटकों को पंजीकृत कर रहे हैं, लेकिन निर्भरता Lazy<T>T के बजाय हल करें। जब तक आप .Value अपनी Lazy<T> की संपत्ति तक नहीं पहुंच पाएंगे, तो निर्भरता का समाधान नहीं किया जाएगा, इसलिए आप कुछ आलसी मूल्यांकन वस्तुओं को पार कर सकते हैं और केवल उस तक पहुंच सकते हैं जिसकी आपको आवश्यकता होगी और जब आपको आवश्यकता हो।

यदि आपके पास उपयोगकर्ता के लिए अधिक विकल्प हैं, तो आपको किसी प्रकार का सार कारखाना इंटरफ़ेस बनाने पर विचार करना चाहिए। इसके बाद आप केवल इस कारखाने को पंजीकृत और हल करेंगे और फैक्ट्री स्वयं अधिसूचनाएं भेजने के लिए उपयुक्त सेवा तैयार करेगी (चाहे वह मेल या एसएमएस या कोई अन्य विकल्प हो)। फैक्ट्री के कार्यान्वयन को हाथ से या कैसल विंडसर द्वारा कोड किया जा सकता है (मुझे लगता है कि संस्करण 3.0 से)।

अक्सर जब मैं इस तरह के फैक्ट्री का उपयोग करता हूं, तो मैं इसे हाथ से कार्यान्वित करता हूं और कंटेनर को निर्भरता के रूप में पास करता हूं, इसलिए कारखाना कार्यान्वयन केवल मेरे कंटेनर पर निर्भर करता है।

1

सामान्य रूप से, आप Typed Factory Facility के साथ ऐसा कर सकते हैं।

संक्षेप में, जब आप घटक बजाय यह एक ईमेल या एसएमएस सेवा देने की उन सेवाओं का उपयोग करता है, को हल, आप इसे एक कारखाने है कि उन्हें (बना सकते हैं देना जो के लिए संदर्भ के बिना, आप द्वारा परिभाषित किया गया है कंटेनर)

सुविधा आपके कारखाने को "कार्यान्वित करने" का ख्याल रखेगी (आपके द्वारा बनाए गए इंटरफ़ेस से), इसलिए बहुत कम करना है।

+0

क्या होगा अगर मेरी प्रत्येक सेवा में निर्भरता का अपना अनूठा सेट है। उदाहरण के लिए, एसएमएस सेवा में 3 अद्वितीय निर्भरताएं हैं, ईमेल सेवा में 4 अद्वितीय निर्भरताएं हैं, आदि। क्या मैं कारखाने में केवल 20 (या हालांकि कई हैं) निर्भरता इंजेक्ट करता हूं? महान प्रतिक्रिया बीटीडब्ल्यू। – orourkedd

+0

कारखाना महल द्वारा कार्यान्वित किया जाता है। आप बस अपनी सेवाओं को सामान्य रूप से कॉन्फ़िगर करते हैं। –

2

बस एक उदाहरण सरल करने के लिए (मार्सिन Deptuła उत्तर के आधार पर)

// activate Lazy initialization feature for all Components 
.Register(Component.For<ILazyComponentLoader>().ImplementedBy<LazyOfTComponentLoader>())  
// register rest of component(s) 
.Register(Component.For<IIssueRepository>().ImplementedBy<IssueRepository>()) 
. .... 

संकल्प lazily (संपत्ति इंजेक्शन)

public Lazy<IIssueRepository> IssueRepository { get; set; } 
IssueRepository.Value.GetLastIssue(); 

संकल्प सामान्य (संपत्ति इंजेक्शन)

public IIssueRepository IssueRepository { get; set; } 
IssueRepository.GetLastIssue();