次のようなインターフェースがあるとしましょう:
public interface ILoggable
{
void Log(Func<string> message, Logger.Type type);
}
そして、次のようないくつかの拡張メソッド:
public static class Logger
{
public static void Log(this ILoggable loggable, Func<string> message) { loggable.Log(message, Type.Information); }
public static void Log(this ILoggable loggable, string prefix, byte[] data, int len) { /* snip */ }
public static void Log(this ILoggable loggable, Exception ex) { /* snip */ }
// And so on...
}
次に、それを好きなものclass CoreService : ServiceBase, ILoggable
に実装しpublic void Log(Func<string> message, Logger.Type type)
(public修飾子はまあまあ...)、すべての拡張メソッドを使用して実際のロギングを行います。
ここまでは良かった…それともあまり良くなかった?このアプローチに何か問題がありますか?そうでない場合、なぜ不便なのか:
catch (Exception ex) {
this.Log(ex); // this works
Log(ex); // this goes not