2009-08-24 16 views
5

के बारे में मैंने विभिन्न साइटों के आस-पास के कुछ प्रश्नों के माध्यम से बंप किया है और उत्तर l4n officianados द्वारा लाइटवेट रैपर के मूल्य की तरफ बढ़ने लगते हैं जो log4net 'is' (नहीं है आप इसे प्राप्त करते हैं?) और दिमाग-दबाने वाले तथ्य के समान अंक।फिर से लॉग 4नेट और यूनिटी आईओसी कॉन्फ़िगरेशन

हालांकि ऐसा लगता है कि उपयोगकर्ता क्या पूछ रहे हैं (और यह मेरा प्रश्न है) लॉग 4नेट objet मॉडल को fluent config इंटरफेस में रजिस्टर टाइप/रजिस्टरइंस्टेंस अनुक्रम में फिट करने का तरीका है।

यहां लक्ष्य एल 4 एन को फिर से लपेटना नहीं होगा, लेकिन केवल एक सभ्य संदर्भ को पकड़ने के लिए जो 'प्रवाह प्रवाह को अपहरण करने की आवश्यकता नहीं है, जैसा कि यह था।

गरीब ejemplow, मैं एक LogManger.GetLogger विधि से Ilog के लिए कॉन्फ़िगर किया गया उदाहरण के लिए एक संदर्भ हो और मेरी बहाव वस्तुओं के गुणों को इसकी सुई देने काफी पहले धाराप्रवाह प्रवाह में यह रखना चाहते हैं।

तो एक अधीर सुझाव के जवाब में, मैं Ilog का एक सामान्य उदाहरण विहित ढंग से बनाई गई की कोशिश की:

log4net.Config.XmlConfigurator.Configure(); 
static readonly log4Net.Ilog Log = LogManager.GetLogger(thatlongassemblyreflectionstuff); 

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

हालांकि, रजिस्टरइंस्टेंस विधि के लिए हस्ताक्षर एक 'टाइप' इंटरफ़ेस नहीं चाहता है।

उन लोगों के लिए जिन्होंने लॉग 4नेट ऑब्जेक्ट मॉडल के माध्यम से खोज नहीं की है, afficiananderos सही हैं: l4n एक 'रैपर' है और आपको लॉग चीज़ी के लिए वास्तविक 'प्रकार' का एक होल्ट नहीं मिल सकता है।

तो अब मुझे परीक्षण करना होगा। और आप जानते हैं कि इसका क्या अर्थ है, इसमें एक मिनट लग सकता है, लेकिन अधिक समय में एक या चार घंटे लगेंगे ('घंटा' और 'चार' की वर्तनी जैसी वास्तविकताएं वास्तविक जीवन में कभी संयोग नहीं होतीं)।

हालांकि, निम्नलिखित, शून्य से विहित स्थापना के बारे में elided हिस्सा है, किया काम:

container 
    .RegisterInstance("Logger", Log, new ContainerControlledLifetimeManager()) 
.RegisterType<IControllerContext, ControllerContext> 
(
    "CtlrCtx", 
    new ContainerControlledLifetimeManager(), 
    new InjectionConstructor(new ResolvedParameter<IMessageBuilder>("MsgBldr")), 
    new InjectionProperty("Log",new ResolvedParameter<ILog>("Logger")) 
); 

तो मूल लॉग वस्तु और लॉग वस्तु के लिए hashcodes मेरी marvy थोड़ा प्रसंग वस्तु की संपत्ति में इंजेक्शन समरूप हैं।

हालांकि

...

इंजेक्शन प्रक्रिया के लिए आवश्यक है कि मैं इसके इंटरफेस के माध्यम से संदर्भ वस्तु के लिए लॉग संपत्ति का पर्दाफाश, यह अर्थ नहीं रह गया एक स्थिर वस्तु हो सकता है। और क्या log4net ILog ऑब्जेक्ट स्थिर है, यह निर्णय लेने वाला कारक है कि यह धारावाहिक है या नहीं, नाटकीय 'रनटाइम अस्थिर हो जाएगा' चेतावनी (जो वास्तव में केवल मैट्रिक्स प्रशंसकों के लिए अर्थपूर्ण है) के बिना असेंबली के बीच मैशेल किया जा सकता है।

निराश, हालांकि खराब नहीं हुआ, मैंने रिजर्वर की निफ्टी 'बैकिंग फील्ड के साथ संपत्ति' का उपयोग किया और बैकिंग फ़ील्ड स्थिर होने के लिए सेट किया, जबकि इंटरफ़ेस संपत्ति गैर स्थैतिक रही। वैसे यह बनाया गया और परीक्षण हरा भाग गया।

तो मैंने एक पुनर्निर्माण भी किया और यह काम किया। तो हो सकता है कि जब यह एकीकरण परीक्षण तक बुलबुले हो तो मैं लॉग 4नेट से पहले चुपके से धारावाहिक हार नहीं करूँगा।

तो शायद यह मदद मिलेगी

धन्यवाद

Stato

+0

लॉगर्स को आवृत्ति चर के रूप में रखना सामान्य बात नहीं है - वे सामान्य रूप से स्थैतिक (यानी कक्षा) चर होते हैं और वैसे भी सिंगलेट के रूप में लागू होते हैं। इसलिए मुझे नहीं लगता कि आपको एकता कंटेनर से उन्हें लाकर कोई फायदा हो - आपको इसकी आवश्यकता क्यों है? –

+0

'क्यों?' निश्चित रूप से एक उचित सवाल है। जवाब को कॉन्फ़िगरेशन के एक बिंदु के साथ करना है। किसी भी लॉगर का उपयोग करके 'हर जगह' वास्तविक कॉन्फ़िगरेशन बोझ बन जाता है और मजेदार होने पर रखरखाव 'एंट' भाग पर भारी होता है। –

उत्तर

5

चाहेंगे एकता 2 मदद में InjectionFactory का उपयोग कर? (this question देखें)।)

IUnityContainer container = new UnityContainer(); 
container.RegisterType<ILog>(new InjectionFactory(factory => LogManager.GetLogger())); 

तो फिर तुम हमेशा की तरह कॉल के साथ लकड़हारा पुनः प्राप्त हल करने के लिए (:

ILog logger = container.Resolve<ILog>(); 
logger.Log(Level.Debug, "Hello world"); 

तुम भी लकड़हारा के जीवनकाल कॉन्फ़िगर करने के लिए सक्षम हो सकता है तो फिर आपके विन्यास कोड कुछ इस तरह दिखेगा कंटेनर कंट्रोलर लाइफटाइम मैनेजर होने के लिए, इसे सिंगलटन इंस्टेंस बनाने के लिए, लेकिन मैंने अभी तक यह सत्यापित नहीं किया है।

+0

इसकी तरह लॉग 4नेट से संबंधित है लेकिन ऑब्जेक्ट इंस्टेंस के लिए उपयोगी है जो स्टार्टअप के लिए भी निर्माण कर रहे हैं। धन्यवाद। –

0
ILog logger = container.Resolve<ILog>(); 
logger.Log(Level.Debug, "Hello world"); 

वास्तव में काम करता है।

हालांकि, यदि आपके पास कक्षा में लॉगर के लिए कोई संपत्ति है, और इस लॉगर इंस्टेंस को इंजेक्ट करना चाहते हैं, तो यह AFAICT काम नहीं करेगा। मुझे लगता है कि मैं लक्ष्य से दूर हो सकता हूं, लेकिन मैं एक नए संदर्भ में लॉगर इंस्टेंस का पुन: उपयोग करने की कोशिश कर रहा हूं। यह सिर्फ पूर्ववत करने योग्य हो सकता है, तो मैं यह इंजेक्शन लगाने पर देने के लिए हो सकता है और बस जो मुझे एक परिणाम केवल हर वर्ग में यह instantiating से मामूली रूप से अलग लगता है कि देता है कि हर वर्ग के लिए लाइन

ILog logger = container.Resolve<ILog>(); 

जोड़ने के लिए, .. ..

मुझे उम्मीद थी कि

private ILog Logger {get;set;} 

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

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