14

के साथ एक घटक के पंजीकरण के लिए उदाहरण निर्दिष्ट करना मेरे पास कैसल विंडसर के बारे में शायद एक साधारण सवाल है, जिसे मैं बहुत लंबे समय तक उपयोग नहीं कर रहा हूं। मैं एक विशिष्ट उदाहरण के साथ एक सेवा पंजीकृत करने की कोशिश कर रहा हूं जो सेवा के सिंगलटन कार्यान्वयन होगा।कैसल विंडसर

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

मैं क्षण भर उम्मीदें इस कोड का उपयोग करके उठाया था:

container.Register(Component.For<IMyInterface>().Instance(serviceObj)); 

लेकिन सभी कैसल उदाहरण के साथ करता है उस पर एक .GetType() करते हैं और प्रकार दर्ज है। सेवा के लिए अनुरोध बाद में कंटेनर को उस प्रकार को बनाने का प्रयास करेंगे और असफलताओं को भरने में असफल हो जाएंगे।

तो क्या ऐसा करने का कोई तरीका है जो मैं यहां करना चाहता हूं? यदि नहीं, तो मैं किसी प्रकार का IServiceProvider तैयार करूंगा जो सेवा के उदाहरण को प्राप्त करे और कंटेनर को भरने के लिए कोई निर्भरता न हो। लेकिन यह सही समाधान की तुलना में अधिक काम की तरह लगता है।

कोई सुझाव? धन्यवाद!

उत्तर

21

कंटेनर कर्नेल ऑब्जेक्ट पर AddComponentInstance विधि का उपयोग करने का प्रयास करें। मुझे लगता है कि आपको यही चाहिए।


कृपया ध्यान दें: इस तकनीक को अब मान्य नहीं है। container.Register(Component.For<T>().Instance(myT)); का प्रयोग करें बजाय (धन्यवाद eouw0o83hf करने के लिए)

+0

धन्यवाद Gerrie और बोजन! एक इलाज किया। –

+8

एक संक्षिप्त नोट के रूप में, इस तकनीक को अब हटा दिया गया है। 'कंटेनर का उपयोग करें। रजिस्ट्रार (घटक। () के लिए। (माइटी)); 'इसके बजाए। – eouw0o83hf

+0

वह लिंक अब भी मृत है – Liam

2

आप ऐसा कर सकते हैं कंटेनर के Kernel संपत्ति के माध्यम से:

container.Kernel.AddComponentInstance<IMyInterface>(serviceObj); 
संबंधित मुद्दे