In C # sollte mein Common.Logging Logger ein Instanzenmitglied oder statisch sein?

8

Suchen ein Projekt , das Common.Logging für .NET, habe ich festgestellt, dass einige Klassen die Logger-Instanz als statisches Member der Klasse deklarieren. Zum Beispiel:

%Vor%

Und in anderen Klassen wird der Logger als Instanz-Member deklariert:

%Vor%

Gibt es einen Grund, den einen oder anderen Ansatz zu bevorzugen?

In welchen Fällen wird jeder Ansatz empfohlen? Geht es um die Sicherheit von Fäden?

Wäre es ein Problem, wenn ich gerade eine "Logger" -Klasse mit einem statischen "Logger" -Mitglied deklariert und das ganze Projekt verwendet hätte (abgesehen von dem Problem, dass ich in der Praxis eine globale Variable hätte)?

    
Fernando Correia 04.12.2012, 23:39
quelle

1 Antwort

9

Die meisten Logger sind Thread-sicher, und das Erstellen von Instanzen von ihnen hat sehr wenig Overhead, sowohl in Bezug auf Zeit und Speicher. Die eigentliche Frage muss also sein, was aus Sicht der Programmierung und Wartung sinnvoll ist.

Da der Logger konzeptionell an Ihre Klasse und nicht an die Instanz der Klasse gebunden ist, bevorzugen viele Leute, sie auf der einen Seite statisch zu halten . Das ist ein absolut gültiges Argument. Zum Beispiel, wenn HelloWorldJob erweitert HelloJob , ich denke, die meisten Leute würden erwarten, dass die Log-Nachricht von Code in HelloJob mit der HelloJob -Klasse gebunden, obwohl Sie eine spezifischere Unterklasse-Instanz haben. Es ist auch schön, auf Ihren Logger von statischen Methoden aus zugreifen zu können, was nicht möglich wäre, wenn es sich nicht um ein statisches Feld handelt.

Auf der anderen Seite gibt es keinen Grund, dass Ihr HelloJob dafür verantwortlich sein sollte, eine eigene Logger-Instanz zu erhalten. Es gibt eine Menge zu sagen für die Verwendung der Dependency-Injection stattdessen (Unit-Testbarkeit, zusätzliche Konfigurierbarkeit und einfacherer Code). Daher schlage ich persönlich vor, dass Ihr Logger von einem DI-Framework injiziert wird. In diesem Fall müsste auf ein Feld pro Instanz referenziert werden.

%Vor%

Ihr DI-Framework kann den Logger basierend auf Details einrichten, die er zur Laufzeit kennt, oder Sie können in Ihren Komponententests einen gefälschten oder verspotteten Logger bereitstellen, um sicherzustellen, dass die erwarteten Log-Nachrichten erstellt werden. Beachten Sie, dass Sie selbst dann, wenn Sie sich auf ein Feld pro Instanz beziehen, immer noch eine Instanz pro Klasse (oder sogar Singleton) verwenden können - dies sind nur Details, die nicht Teil dieser Klasse sein müssen Sorge.

    
StriplingWarrior 04.12.2012, 23:48
quelle

Tags und Links