假设我有一个界面,如下所示:
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)
为我喜欢的任何东西(公共修饰符有点……)并使用所有扩展方法来进行实际的日志记录。
到目前为止这么好……还是不太好?这种方法有问题吗?如果没有,那么为什么会带来不便:
catch (Exception ex) {
this.Log(ex); // this works
Log(ex); // this goes not