Lassen Sie uns sagen, dass ich eine Schnittstelle haben, wie folgt aus:Mit Erweiterungsmethoden innerhalb erweiterten Klasse selbst
public interface ILoggable
{
void Log(Func<string> message, Logger.Type type);
}
Und einige Erweiterungsmethoden, wie folgt aus:
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...
}
dann in jedem class CoreService : ServiceBase, ILoggable
oder so, die ich umsetzen dass public void Log(Func<string> message, Logger.Type type)
zu was auch immer ich mag (öffentliche Modifikator wird Art von meh ...) und verwenden Sie alle Erweiterungsmethoden, um tatsächliche Protokollierung zu tun.
So weit so gut ... oder nicht so gut? Stimmt etwas nicht mit diesem Ansatz? Wenn nicht, dann, warum die Unannehmlichkeiten:
catch (Exception ex) {
this.Log(ex); // this works
Log(ex); // this goes not
Sie können auch 'Log (this, ex)' aufrufen, was in dieser Situation insgesamt besser lesbar erscheint. –
@HenkHolterman: Nun, Sie müssten Logger.Log (this, ex) aufrufen ... –