Diciamo che ho un'interfaccia, in questo modo:Utilizzando metodi di estensione all'interno classe estesa si
public interface ILoggable
{
void Log(Func<string> message, Logger.Type type);
}
E alcuni Metodi di estensione, come questo:
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...
}
Poi in qualsiasi class CoreService : ServiceBase, ILoggable
o tali implemento che public void Log(Func<string> message, Logger.Type type)
a qualsiasi cosa mi piaccia (il modificatore pubblico è una specie di meh ...) e utilizzare tutti i metodi di estensione per fare il logging reale.
Fin qui tutto bene ... o non così buono? C'è qualcosa di sbagliato in questo approccio? Se no, allora perché l'inconveniente:
catch (Exception ex) {
this.Log(ex); // this works
Log(ex); // this goes not
Puoi anche chiamare 'Log (this, ex)' che sembra del tutto più leggibile in questa situazione. –
@HenkHolterman: Beh, dovresti chiamare Logger.Log (questo, ex) ... –