2011-01-24 18 views
9

Tôi đang chuyển đổi từ Prism 2.1 sang Prism 4, và tôi cần phải viết một lớp ILoggerFacade cho Log4Net. Mã cũ của tôi từ Prism 2.1 không còn hoạt động nữa. Có ai có mã mẫu cho một lớp ILoggerFacade họ muốn sẵn sàng chia sẻ? Cảm ơn bạn đã giúp đỡ.Lăng kính 4 ILoggerFacade cho Log4Net?

Trả lời

23

Tôi đã tìm ra. Rất giống với Prism 2. Đầu tiên, tạo một lớp logger tùy chỉnh thực hiện ILoggerFacade. Đây là lớp học của tôi:

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 
    } 
} 

Sau đó, trong lớp Prism 4 Bootstrapper, thêm ghi đè vào CreateLogger() phương thức trả về một thể hiện mới của lớp tùy chỉnh logger:

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

Lưu ý rằng trong tùy chỉnh lớp logger, ILog là giao diện Log4Net và LogManager là đối tượng Log4Net.

Viết cho trình ghi nhật ký tùy chỉnh từ mã của riêng bạn (Lăng kính chăm sóc các mục nhập nhật ký của riêng nó) hơi khác một chút so với trong Prism 2.1. Bạn có thể giải quyết logger trực tiếp từ container IoC, hoặc bạn có thể sử dụng ServiceLocator. Các ServiceLocator có lợi thế là container-thuyết bất khả tri, có nghĩa là các container bên dưới không thực sự quan trọng. Dưới đây là một ví dụ về giải quyết một logger sử dụng ServiceLocator:

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

Các ServiceLocator đòi hỏi rằng các dự án máy chủ có một tham chiếu đến Microsoft.Practices.ServiceLocation.dll và phù hợp với using tuyên bố.

+0

Cảm ơn David này. – JohnC

+7

Cảm ơn bạn, nhưng tại sao bạn truyền nó vào 'Log4NetLogger'? nếu giải pháp ghi nhật ký được thay đổi thì tất cả các phiên bản của trình ghi nhật ký phải được truyền sang một loại khác một lần nữa hoặc xóa bỏ mã trình diễn! – Jalal

+0

Thật vậy, tại sao bạn sẽ bỏ? Nó sẽ ngụ ý rằng bạn sẽ cần một tham chiếu đến hội đồng định nghĩa Log4NetLogger, mà đánh bại toàn bộ mục đích ... – Kris

Các vấn đề liên quan