我想寫一個記錄器,可以很容易地附加到我當前項目中的任何類。對於開發而言,將消息記錄到控制檯會很方便,而在最終版本中,我想登錄到文件或其他東西。一個應該能夠通過編輯幾行代碼或理想的設置文件來改變行爲。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++,我只需要使用私有繼承。
這是現在好還是壞的設計?任何我可以改進的地方?有沒有一種方法可以在沒有擴展方法的情況下提供具有日誌記錄功能的類,但是幾乎沒有變化?
這可能應該移動到http://codereview.stackexchange.com/ – Baldrick