7

कल्पना कीजिए मैं नीचे है:SimpleInjector के माध्यम से एक सिंगलटन का पंजीयन और एक ही उदाहरण लौटने के लिए, विभिन्न इंटरफेस के लिए यह लागू करता

public interface IocInterface1 { } 

public interface IocInterface2 { } 

public class IocImpl : IocInterface1, IocInterface2 { } 

मैं चाहूँगा कि अगर मैं के माध्यम से ऊपर की कक्षाओं/इंटरफेस के किसी भी मामले प्राप्त करने की कोशिश आईओसी, मुझे एक ही उदाहरण मिलता है, एक सिंगलटन प्रति प्रकार नहीं। उदाहरण के लिए, b1 और b2 नीचे सही होना चाहिए:

_container.RegisterSingle<IocInterface1, IocImpl>(); 
_container.RegisterSingle<IocInterface2, IocImpl>(); 
_container.RegisterSingle<IocImpl, IocImpl>(); 

var test1 = _container.GetInstance<IocInterface1>(); 
var test2 = _container.GetInstance<IocInterface2>(); 
var test3 = _container.GetInstance<IocImpl>(); 

bool b1 = test1 == test2; 
bool b2 = test2 == test3; 

यह संभव है?

उत्तर

10

यदि आप एक ही पंजीकरण के साथ एक से अधिक प्रकार के पंजीकरण करना चाहते हैं तो आपको अपने कार्यान्वयन प्रकार IocImpl के लिए सिंगलटन पंजीकरण ऑब्जेक्ट की आवश्यकता होगी।

तो फिर तुम AddRegistration उपयोग करने के लिए विभिन्न सेवाओं के लिए इस पंजीकरण जोड़ने की जरूरत: IocInterface1, IocInterface2 आदि .:

var _container = new Container(); 
var registration = 
    Lifestyle.Singleton.CreateRegistration<IocImpl, IocImpl>(_container); 

_container.AddRegistration(typeof(IocImpl), registration); 
_container.AddRegistration(typeof(IocInterface1), registration); 
_container.AddRegistration(typeof(IocInterface2), registration); 

documenation में वर्णित हैं: Register multiple interfaces with the same implementation

या फिर, आप एक बना सकते हैं प्रतिनिधियों का उपयोग करके मैपिंग:

_container.RegisterSingle<IocImpl>(); 
_container.RegisterSingle<IocInterface1>(() => container.GetInstance<IocImpl>()); 
_container.RegisterSingle<IocInterface2>(() => container.GetInstance<IocImpl>()); 

ज्यादातर मामलों में दोनों परीक्षाएं ples कार्यात्मक रूप से समकक्ष हैं, लेकिन पूर्व को प्राथमिकता दी जाती है।

+0

यह मेरी ज़रूरत के लिए अच्छा लगता है - हालांकि, क्या यह 'कंटेनर के लिए पूरा करता है। रजिस्ट्रार सिंगल ओपेनजेनेरिक()' भी? कारण यह है कि मेरे पास एक असेंबली स्कैनर है जो सभी प्रकारों को स्कैन करता है जिन्हें मैंने कस्टम गुण के साथ सजाने के लिए बनाया है जिसे मैंने '[IocComponent]' बनाया है, और यह ओपन-जेनरिक के लिए भी प्रदान करता है। –

+0

'RegisterSingleOpenGeneric' थोड़ा अलग काम करता है क्योंकि यह 'ResolveUnregisteredType' ईवेंट में फ्लाई पर पंजीकरण बना रहा है ... मुझे इस बारे में सोचना होगा कि इसे 'RegisterSingleOpenGeneric' विधि' के तर्क को दोबारा बदलने के बिना कैसे किया जा सकता है। लेकिन मुझे लगता है कि आपको यह पूछना चाहिए कि यह एक अनुवर्ती प्रश्न है जहां आप स्कैनिंग कैसे काम करते हैं और जेनेरिक प्रकारों को पंजीकृत करने का प्रयास कैसे करते हैं, इसका विवरण निर्दिष्ट करते हैं। – nemesv

+0

मैं @nemesv से सहमत हूं: कृपया इन विवरणों के साथ एक नया प्रश्न पूछें। यह जवाब सही है। इसके लिए +1। – Steven

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