2009-06-01 7 views
1

Ich habe eine Protokollierungsklasse, die beim Start einer Konsolenanwendung instanziiert wird und die in einer statischen Variable gespeichert wird.Globale Einstellungen an Instanz übergeben oder direkt referenziert

Wenn ich möchte, dass eine Klasse den Logger verwendet, sollte er an die Klasse im Konstruktor übergeben oder direkt referenziert werden?

Ich versuche Einheitentests zu schreiben und so oder so sollte ich es tun können. Ich muss nur die statische Variable setzen, bevor ich den Code aufruft, der sie benutzt.

Prost.

Antwort

0

Um Ihre Klassen als Einheit testbar zu machen, sollten alle Abhängigkeiten, einschließlich Logger, wann immer möglich weitergegeben werden. Dies wird als Dependency Injection (DI) bezeichnet und ist ein sehr gebräuchliches Standardmuster für schreibbaren Testcode. Logging ist fast immer eine Querschnittsaufgabe, die nur in den Methoden der Methoden verankert ist, da es nicht wirklich vernünftige AOP-Frameworks gibt, um diese Bedenken richtig herauszuziehen und sie deklarativ anzuwenden. Wenn Sie beim Schreiben/Ausführen von Komponententests mit der Protokollierung arbeiten, erhöht sich die Komplexität der Tests, was möglicherweise zusätzliche Konfigurationsbedenken hinzufügt, wenn Sie Ihre Tests so einfach und zielgerichtet wie möglich halten möchten.

+0

Ich stimme zu, aber es bedeutet, dass jede Klasse, die Protokollierung benötigt, eine Instanz des Loggers an sie übergeben muss. Wird das zu beschäftigt sein? – Schotime

0

Sie könnten eine Instanz davon erstellen und diese Instanz als Mitglied der gleichen Klasse & speichern, die über eine Eigenschaft zurückgegeben wird.

z.B. Logger.Default
Dies wird den Verweis auf die Instanz, die erstellt wurde, zurückgeben.

BEARBEITEN: Ein Beispiel dafür könnte Console-Klasse & It's SetOut-Methode sein. Ich meine, Sie können weiterhin Console.WriteLine .... und wenn Sie den Stream ändern möchten, verwenden Sie die SetOut-Methode. Es leitet die Ausgabe in einen neuen Stream um.

Hoffe, dass hilft.

+0

Eine Bitte an alle: Bitte erläutern Sie Ihren Punkt beim Down-Voting. Das wird mir helfen, Dinge zu verstehen und mich selbst zu korrigieren und den Grund zu erfahren, warum diese Antwort nicht hilft. – shahkalpesh

+0

Das Erklären eines Downvotes ist nicht wirklich Teil der DNA dieser Seite, aber wahrscheinlich ist sie hier nicht signifikant. Jede Antwort hier (außer vielleicht einer) wurde in einem sehr kurzen Zeitrahmen abgelehnt. –

+0

Website sollte keine DNA haben. Aber die Leute sollten die DNA der Höflichkeit haben;) – shahkalpesh

Verwandte Themen