2014-02-19 96 views
2

我想寫一個記錄器,可以很容易地附加到我當前項目中的任何類。對於開發而言,將消息記錄到控制檯會很方便,而在最終版本中,我想登錄到文件或其他東西。一個應該能夠通過編輯幾行代碼或理想的設置文件來改變行爲。C#日誌記錄設計:擴展方法,替代方法?

我有什麼到目前爲止,這是階級結構:

public interface ILogger { 
    void LogMessage(String message); 
    // ... other logging functions (exceptions, time etc.) don't matter here 
}; 

public interface ILoggable { }; 

public static class LoggingProvider { 
    private static ILogger logger = ConsoleLogger.handle; 
     public static void LogMessage(this ILoggable obj, String message) { 
     logger.LogMessage(message); 
    } 
} 


public sealed class NullLogger : ILogger { 
     // A logger that does nothing.. 
}; 

public sealed class FileLogger : ILogger { 
    // A logger that writes to a file.. 
}; 

public sealed class ConsoleLogger : ILogger { 
    #region Console Allocation 
    [DllImport("kernel32.dll", SetLastError = true)] 
    static extern bool AllocConsole(); 
    [DllImport("kernel32.dll", SetLastError = true)] 
    static extern bool FreeConsole(); 
    #endregion 

    #region Singleton implementation 
    private static Object cs = new Object(); 
    private static ILogger instance = null; 
    private ConsoleLogger() { 
     AllocConsole(); 
    } 
    ~ConsoleLogger() { 
     FreeConsole(); 
    } 
    public static ILogger handle { 
     get { 
      lock (cs) { if (instance == null) instance = new ConsoleLogger(); } 
      return instance; 
     } 
    } 
    #endregion 

    #region ILogger Member 
    public void LogMessage(string message) { 
     lock (cs) { 
      String logString = getTimeString(); 
      logString += (" -> \t " + message); 
      Console.WriteLine(logString); 
     } 
    } 
    #endregion 

    #region Helper functions 
    // ... 
    #endregion 
}; 

現在,我可以有任何我想實現ILoggable類,並通過擴展方法LogingProvider.LogMessage我可以調用這些類中this.LogMessage("...")。如果是C++,我只需要使用私有繼承。

這是現在好還是壞的設計?任何我可以改進的地方?有沒有一種方法可以在沒有擴展方法的情況下提供具有日誌記錄功能的類,但是幾乎沒有變化?

+0

這可能應該移動到http://codereview.stackexchange.com/ – Baldrick

回答

2

您的設計看起來有點過度設計一見鍾情。在此方法中:

public static void LogMessage(this ILoggable obj, String message) { 
    logger.LogMessage(message); 
} 

ILoggable obj完全沒有使用。爲什麼你需要它呢?爲什麼不只有:

public static void LogMessage(String message) { 
    logger.LogMessage(message); 
} 

並且把它叫做LoggingProvider.LogMessage(...)

請注意,看看Log4Net,這是日誌記錄功能的行業標準實現。

+1

你的權利,'obj'不使用。但我需要它限制日誌記錄到某些類,即那些實現'ILoggable'的類。 – Matz

+0

@Matz,我不太瞭解你的評論。擴展方法是設計公開的,所以人們可以從任何地方登錄,只要他們調用某個ILoggable對象的方法(無論是否相關)。 – Grzenio