.net - What is a correct approach to register several instances for the same type in Windsor Container? -


मैं CommonSrviceLocator के साथ WindworContainer के साथ अपने NHibernage.isession उदाहरण इएसशन उदाहरण सत्रफ़ायर के माध्यम से बनाया गया है कुछ कारणों से मुझे एक आवेदन में विभिन्न डेटाबेस के साथ काम करने की आवश्यकता है, इसलिए मुझे अलग कनेक्शन स्ट्रिंग और विभिन्न NHibernate.isession ऑब्जेक्ट की आवश्यकता है।

SessionFactory डीबी नाम से भिन्न इएसशन वस्तुएं बनाएं इसलिए मैं अलग प्राप्त करना चाहते हैं ISession अपने आवेदन में वस्तुओं निम्न सिंटैक्स का उपयोग कर:

  ISesssion sessionForDb1 = ServiceLocator.Current.GetInstance & LT; ISession & gt; ( "सत्र के लिए DB1 "); इएससिसियन सत्र ForDb2 = सेवासूत्र। वर्तमान। गेट इंस्टेंस & lt; इएसेशन & gt; ("सत्र-के-डीबी 2");  

इसे प्राप्त करने के लिए मैंने कंटेनर पंजीकरण के बाद बनाया है:

  IWindsorContainer कंटेनर = नया विंडसर कॉन्टैनेयर (); container.AddFacility & LT; FactorySupportFacility & gt; (); container.Register (Component.For & LT; ISessionFactory & gt; () .Named ( "सत्र-कारखाने के लिए DB1") .LifeStyle.Singleton .UsingFactoryMethod (() = & gt;। नई NHibernateConfigurator () CreateSessionFactoryForDb1 ()), Component.For करें & lt ; ISessionFactory & gt; () .Named ( "सत्र-factory2 के लिए डीबी 2") .LifeStyle.Singleton .UsingFactoryMethod (() = & gt; नई NHibernateConfigurator () CreateSessionFactoryForDb2 ()।), Component.For & LT; ISession & gt; () .Named ( "सत्र के लिए DB1") .LifeStyle.PerWebRequest .UsingFactoryMethod (कर्नेल = & gt; kernel.Resolve & LT; ISessionFactory & gt;। ( "सत्र-कारखाने के लिए DB1") OpenSession ()), Component.For & LT; ISession & gt; ( ) .Named ( "सत्र के लिए डीबी 2") .LifeStyle.PerWebRequest .UsingFactoryMethod (कर्नेल = & gt; kernel.Resolve & LT; ISessionFactory & gt; ( "सत्र-factory2 के लिए डीबी 2")। OpenSession ())); सेवासूत्रदाता .सेटलोकेटरप्रदाता (() = & gt; नया विंडसर सेवा लॉकेटर (कंटेनर));  

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

मैं चाहूंगा पता है कि वस्तुओं के समान परिवारों को पंजीकृत करने के लिए कोई बेहतर तरीका क्या है?

एक ही सेवा प्रकार, आप उन्हें भेदभाव करने के लिए घटक आईडी (स्ट्रिंग) का उपयोग करना होगा आपके मामले में, यदि आप सीधे अपनी कक्षाओं में किसी इज़ेशनफैक्टर को इंजेक्ट नहीं करते हैं, तो आप इस रजिस्ट्रेशन को एक एक्सटेंशन विधि में लपेट सकते हैं, उदाहरण के लिए:

<प्री> सार्वजनिक स्थैतिक वर्ग विंडसर सत्रफ़ैक्टिंगएन्टेन्टेन्स {सार्वजनिक स्टेटिक रिक्त रजिस्टर सत्र (यह आईडब्ल्यूआईडस्सर कंटेनर कंटेनर , स्ट्रिंग का नाम, फ़नक & lt; NHibernateConfigurator, ISessionFactory & gt; कॉन्फ़िगरेटर) {var id = Guid.NewGuid ()। ToString (); container.Register (Component.For & LT; ISessionFactory & gt; () .Named (आईडी) .LifeStyle.Singleton .UsingFactoryMethod (() = & gt; विन्यासक (नई NHibernateConfigurator ())), Component.For & LT; ISession & gt; () .Named (नाम ) .LifeStyle.PerWebRequest .UsingFactoryMethod (k = & gt; के.रेशोल & lt; ISessionFactory & gt; (आईडी)। ओपन सत्र ())); }} कंटेनर। पंजीयक सत्र ("सत्र-के-डीबी 1", सी = & gt; सी। क्रेेट्सेशनफैक्टरफोरडीबी 1 ()); कंटेनर। पंजीयक सत्र ("सत्र-के लिए-डीबी 2", सी = & gt; सी। क्रेेट्सजनफैक्टरफॉरडीबी 2 ()); Var सत्र = कंटेनर। रिज़ोलिव & lt; ISession & gt; ("session-for-db1");

या सत्र फ़ैक्टरी आईडी के लिए GUID का उपयोग करने के बजाय, आप var id = name + "-factory" की तरह कुछ कर सकते हैं, जैसे कि सम्मेलन।

एक और संभावना विस्तारित प्रॉपर्टीज का प्रयोग करेगी, लेकिन इससे चीजों को और भी अधिक जटिल हो सकता है और अंत में हमेशा किसी तरह का भेदभाव करने वाला हो।

लेकिन यहां असली समस्या है कि आप सेवा लोकेटर का उपयोग कर रहे हैं सामान्य कंटेनर उपयोग में आपको इसका उपयोग कभी नहीं करना चाहिए। इसके बजाय, अपने पंजीकृत घटकों में आप किस सत्र को चाहते हैं, यह निर्धारित करने के लिए सेवा ओवरराइड का उपयोग करें।


Comments

Popular posts from this blog

c# - sqlDecimal to decimal clr stored procedure Unable to cast object of type 'System.Data.SqlTypes.SqlDecimal' to type 'System.IConvertible' -

Calling GetGUIThreadInfo from Outlook VBA -

Obfuscating Python code? -