2011-01-24 23 views
9

मैं प्रिज्म 2.1 से प्रिज्म 4 में परिवर्तित कर रहा हूं, और मुझे Log4Net के लिए एक ILoggerFacade क्लास लिखने की आवश्यकता है। प्रिज्म 2.1 से मेरा पुराना कोड अब काम नहीं करता है। क्या किसी के पास ILoggerFacade क्लास के लिए नमूना कोड है जो वे साझा करने के इच्छुक होंगे? आपकी सहायता के लिए धन्यवाद.प्रिज्म 4 LogogNet के लिए ILoggerFacade?

उत्तर

23

मैंने इसे समझ लिया। प्रिज्म के समान ही 2. सबसे पहले, एक कस्टम लॉगर क्लास बनाएं जो ILoggerFacade लागू करता है। यहाँ मेरी कक्षा है:

using log4net; 
using Microsoft.Practices.Prism.Logging; 

namespace FsNoteMaster3 
{ 
    class Log4NetLogger : ILoggerFacade 
    { 
     #region Fields 

     // Member variables 
     private readonly ILog m_Logger = LogManager.GetLogger(typeof(Log4NetLogger)); 

     #endregion 

     #region ILoggerFacade Members 

     /// <summary> 
     /// Writes a log message. 
     /// </summary> 
     /// <param name="message">The message to write.</param> 
     /// <param name="category">The message category.</param> 
     /// <param name="priority">Not used by Log4Net; pass Priority.None.</param> 
     public void Log(string message, Category category, Priority priority) 
     { 
      switch (category) 
      { 
       case Category.Debug: 
        m_Logger.Debug(message); 
        break; 
       case Category.Warn: 
        m_Logger.Warn(message); 
        break; 
       case Category.Exception: 
        m_Logger.Error(message); 
        break; 
       case Category.Info: 
        m_Logger.Info(message); 
        break; 
      } 
     } 

     #endregion 
    } 
} 

फिर, प्रिज्म 4 Bootstrapper कक्षा में, CreateLogger() विधि कि कस्टम लकड़हारा वर्ग का एक नया उदाहरण देता है के लिए एक ओवरराइड जोड़ें:

protected override Microsoft.Practices.Prism.Logging.ILoggerFacade CreateLogger() 
{ 
    return new Log4NetLogger(); 
} 

ध्यान दें कि कस्टम में लॉगर क्लास, ILog एक लॉग 4नेट इंटरफ़ेस है, और LogManager एक Log4Net ऑब्जेक्ट है।

अपने कोड से कस्टम लॉगर को लिखना (प्रिज्म अपनी लॉग प्रविष्टियों का ख्याल रखता है) प्रिज्म 2.1 की तुलना में थोड़ा अलग है। आप सीधे आईओसी कंटेनर से लॉगर को हल कर सकते हैं, या आप ServiceLocator का उपयोग कर सकते हैं। ServiceLocator में कंटेनर-अज्ञेयवादी होने का लाभ है, जिसका अर्थ है कि अंतर्निहित कंटेनर वास्तव में कोई फर्क नहीं पड़ता।

var logger = (Log4NetLogger)ServiceLocator.Current.GetInstance(typeof(ILoggerFacade)); 
logger.Log("App.OnStartup() completed", Category.Info ,Priority.None); 

ServiceLocator की आवश्यकता है कि मेजबान परियोजना Microsoft.Practices.ServiceLocation.dll के लिए एक संदर्भ है और एक मिलान using बयान है: यहाँ एक लकड़हारा को हल करने ServiceLocator का उपयोग करने का एक उदाहरण है।

+0

इस डेविड के लिए धन्यवाद। – JohnC

+7

धन्यवाद, लेकिन आपने इसे 'Log4NetLogger' क्यों डाला? अगर लॉगिंग समाधान बदल जाता है तो सभी लॉगर इंस्टेंस को फिर से दूसरे प्रकार में डाला जाना चाहिए या कास्ट कोड हटा देना चाहिए! – Jalal

+0

दरअसल, आप क्यों डालेंगे? यह इंगित करेगा कि आपको उस असेंबली के संदर्भ की आवश्यकता होगी जो Log4NetLogger को परिभाषित करता है, जो पूरे उद्देश्य को हरा देता है ... – Kris