4 Stimmen

C# - Globales Programmobjekt

Szenario

Ich habe eine nicht-statische Klasse, die Log4Net umschließt. Das ist wirklich praktisch, da es mit einer weiteren Anwendung verknüpft ist, die Protokolle verschiedener Prozesse anzeigt, die in einer Vielzahl von Software auftreten, die ich schreibe (damit ich sehen kann, wo Fehler auftreten, Batch-Prozesse fehlschlagen usw.)

Problem

Das ist ja alles schön und gut, aber wenn ich einen ganzen Prozess protokollieren will, muss ich eine Reihe von Dingen tun:

  1. Instanziieren Sie das Logging-Objekt.
  2. Sag ihm, er soll beginnen.
  3. Log stuff.
  4. Sag ihm, er soll aufhören.

Das bedeutet, dass ich, wenn ein Prozess außerhalb der Klasse läuft, das Logging-Objekt herumreichen muss, was mühsam ist und unordentlich aussieht.

Frage

Wie kann ich im Wesentlichen nur deklarieren das Objekt in einer solchen Weise, dass es global von allen Klassen zugänglich ist......und machen es statisch ist nicht wirklich eine Option, ich glaube nicht.

.....Das könnte Zeitverschwendung sein, aber ich mag Meinungen.

6voto

Jon Skeet Punkte 1325502

Warum glauben Sie, dass es nicht möglich ist, "es" statisch zu machen? Ich vermute, Sie verwechseln die Ideen eines statischen Klasse und eine statische variabel die einen Verweis auf eine Instanz einer nicht-statischen Klasse verwaltet.

public class Foo
{
    // Instantiate here, or somewhere else
    private static LogWrapper logWrapper = new LogWrapper(...); 
    public static LogWrapper LogWrapper { get { return logWrapper; } }
}

Nur weil die Klasse nicht statisch ist, heißt das nicht, dass man nicht eine Singleton-Instanz davon haben kann, die global verfügbar ist. Normalerweise nicht so eine gute Idee, aber nicht zu schlecht für die Protokollierung.

Wenn Sie tun den Weg des Singletons gehen, sollten Sie vielleicht meinen Artikel über Implementierung eines Singletons in C# .

5voto

SLaks Punkte 832502

Es klingt, als wollten Sie eine Einzelperson .

Sie können eine statische Eigenschaft erstellen, die die einzelne Instanz Ihrer Klasse zurückgibt.

4voto

TrueWill Punkte 24357

Anstatt den statischen Weg oder den Singleton-Weg zu gehen, könnten Sie untersuchen, ob Sie mit Injektion von Abhängigkeiten (DI) mit einer IoC-Container-Framework . Dadurch bleiben Ihre Klassen testbar und werden von der Protokollierungsklasse entkoppelt.

Der IoC-Container übernimmt die Verwaltung der Lebensdauer für Sie; durch die Angabe der Lebensdauer des Containers können Sie ein Singleton simulieren, ohne die Nachteile in Kauf nehmen zu müssen.

Es gibt eine Lernkurve, aber das ist es wert; DI hat viele andere Vorteile.

EDIT: Der Trick ist, die Service-Locator-Falle zu vermeiden. Mark Seemann hat einige gute Artikel zu diesem Thema (und ein Buch, das demnächst erscheint).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X