Poszukując a project, który używa Common.Logging dla .NET, zauważyłem, że niektóre klasy deklarują instancję rejestratora jako statyczny element klasy. Na przykład:W języku C# powinien mój rejestrator Common.Logging być członkiem instancji lub statyczne?
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")));
}
}
A w innych klasach rejestrator jest zadeklarowana jako członek przykład:
public class SimpleExample : IExample
{
public virtual void Run()
{
ILog log = LogManager.GetLogger(typeof (SimpleExample));
log.Info("------- Initializing ----------------------");
// etc
}
}
Czy istnieje powód do preferowania jednego lub drugiego podejścia?
W jakich przypadkach zalecane jest każde podejście? Czy ma to związek z bezpieczeństwem wątków?
Czy byłby to problem, gdybym właśnie ogłosił klasę "Logger" ze statycznym "loggerem" i całym projektem (oprócz problemu, który w praktyce miałbym zmienną globalną)?
'LogManager.GetLogger' jest prawdopodobnie wewnętrznie implementowany poprzez wtrysk zależności; oznacza to, że zależność jest zarządzana w ramach programu rejestrującego. Nie chciałbym, aby moje rejestratory były przechowywane jako "pole dla instancji" i uzyskiwanie tego narzutu dla każdej utworzonej instancji. Statyczne przechowywanie go raz, gdy klasa jest załadowana po raz pierwszy, działa dla mnie. –
@ChrisSinclair: To prawda, że szczegóły * tworzenia * są obsługiwane przez LogManager.GetLogger, a ja lubię tę Commons.Logging zapewnia wspólny interfejs logowania, pozostawiając ci swobodę przełączania podstawowych struktur, konfiguracji itp. Jednak jest to przykład wzoru fabrycznego, a nie iniekcji zależnej. Wzorzec fabryczny ma wiele zalet w porównaniu do ręcznego tworzenia instancji, ale iniekcja Dependency nadal ma dodatkowe zalety. Twój framework DI może wciąż być skonfigurowany do ponownego użycia pojedynczego rejestratora dla każdego typu, a narzut jest praktycznie niezmierzony w 90% przypadków. – StriplingWarrior
Dokumentacja Common.Logging stwierdza, że publiczne statyczne LogManagers są bezpieczne dla wątków, ale metody instancji nie są, co wydaje się być sprzeczne z tą odpowiedzią. http://netcommon.sourceforge.net/docs/2.0.0/api/html/Common.Logging~Common.Logging.LogManager.html – coderjoe