Alla ricerca di a project che utilizza Common.Logging per .NET, ho notato che alcune classi dichiarano l'istanza del logger come membro statico di classe. Per esempio:In C# il mio logger Common.Logging può essere un membro di istanza o statico?
public class HelloJob : IJob
{
private static ILog _log = LogManager.GetLogger(typeof(HelloJob));
public HelloJob()
{
}
public virtual void Execute(IJobExecutionContext context)
{
_log.Info(string.Format("Hello World! - {0}", System.DateTime.Now.ToString("r")));
}
}
E in altre classi logger è dichiarato come un membro di istanza:
public class SimpleExample : IExample
{
public virtual void Run()
{
ILog log = LogManager.GetLogger(typeof (SimpleExample));
log.Info("------- Initializing ----------------------");
// etc
}
}
C'è un motivo per preferire un approccio o l'altro?
In quali casi è consigliato ogni approccio? È legato alla sicurezza del filo?
Sarebbe un problema se avessi appena dichiarato una classe "Logger" con un membro "logger" statico e l'intero progetto lo usasse (a parte il problema che avrei in pratica una variabile globale)?
'LogManager.GetLogger' è probabilmente implementato internamente tramite l'integrazione delle dipendenze; cioè, la dipendenza è gestita all'interno del logger. Non vorrei che i miei logger fossero archiviati come "campi per istanza" e ricevessi quell'overhead per ogni istanza creata. Lo memorizza staticamente una volta quando la classe viene caricata per la prima volta funziona per me. –
@ChrisSinclair: È vero che i dettagli di istanziazione * sono gestiti da LogManager.GetLogger e mi piace che Commons.Logging fornisca un'interfaccia di registrazione comune, lasciandoti libero di cambiare i framework, le configurazioni, ecc. Sottostanti. Tuttavia, questo è un esempio del modello di fabbrica, non di dipendenza da iniezione. Il modello di fabbrica comporta molti vantaggi rispetto all'istanziazione manuale, ma l'iniezione di dipendenza comporta ancora ulteriori vantaggi. Il tuo framework DI può ancora essere impostato per riutilizzare un singolo logger per ciascun tipo, e il sovraccarico è praticamente incommensurabile il 90% delle volte. – StriplingWarrior
Nella documentazione Common.Logging si afferma che i LogManager pubblici statici sono thread-safe, ma i metodi di istanza non lo sono, il che sembra contrario a questa risposta. http://netcommon.sourceforge.net/docs/2.0.0/api/html/Common.Logging~Common.Logging.LogManager.html – coderjoe