2011-11-08 14 views
5

Mam biblioteki klas w języku C# i ma wiele różnych funkcji dla mnie. Chcę być w stanie logować się przez całą klasę, ale naprawdę nie chcę przez cały czas przekazywać instancji biblioteki rejestrowania.Logowanie w bibliotece klas bez odnośników mija

np.

public void MyMethod(LoggingClass logger) 
{ 
    logger.log("something"); 
} 

public void MyMehtod2(LoggingClass logger) 
{ 
    logger.log("something else"); 
} 

Mam klasy wszędzie w całej tej biblioteki i zmagam się z dobrej drodze do tego celu. Zastanawiałem się nad zastrzykiem uzależnienia z Ninject, ale nie mogę się zorientować, jak to powinno działać.

Podsumowując, chcę móc mieć klasę rejestrowania i móc ją utworzyć raz, a następnie użyć jej wszędzie do zalogowania.

Odpowiedz

5

Nie widzę potrzeby singletonu. Po prostu użyj klasy statycznej w bibliotece:

internal static class Logger { 

static Logger() { 

    // configure logger 

} 

internal static void Log(string Message, params object[] args) { 

    var message = string.Format(Message, args); 
    // write message 

} 
+1

UWAGA: Drugi parametr w podpisie dla 'Log' ma literówkę. Słowo kluczowe to 'params', a nie' param', a cała linia powinna brzmieć: 'internal statical void Log (string Message, params object [] args) {' –

+0

Dzięki @DavidTansey: naprawiono – IAbstract

+0

@Abstract Jak mogę podzielić się wspólną logować się między kodem wywołującym bibliotekę klas a samą biblioteką klas? – Howiecamp

0

Do rejestratora można użyć numeru singleton i wywoływać go w dowolnym miejscu, jak .

+1

Myślę, że singleton jest złą formą i nie jest uzasadniony w tym przypadku. – IAbstract

+0

Myślę, że możesz to wyjaśnić. – CodeCaster

+0

Singletons nie powinien być pierwszym czynnikiem dla żadnego rozwiązania. Jeśli najpierw myślisz, że "singleton może tutaj pracować" *, powinieneś po prostu użyć klasy statycznej. Jeśli jednak stwierdzisz, że klasa statyczna wymaga stanu lub musi implementować jakiś interfejs, ** wtedy ** rozważa singleton. Najczęściej wystarczą klasy statyczne. – IAbstract

1

Moja preferencja to metody rozszerzające, które implementują pewną klasę statyczną, o której wspomina @Abstract. Jeśli twoje zajęcia wszystkie zaimplementować własny interfejs Ilog można zrobić to tak:

public static void Log(this ILog source, string message) 
{ 
    source.Log(message, null); 
} 

public static void Log(this ILog source, string message, param object[] args) 
{ 
    // Assuming a static class as mentioned by @IAbstract 
    Logger.Log(message, args); 
} 

Następnie w klasach lub z dowolnego miejsca w zależności od poziomu ochrony byłbyś w stanie wykorzystać this.Log(message) lub zewnętrznie myClass.Log(message). Nie musi to być informacja publiczna, ale zależy to od potrzeb biblioteki.

Powiązane problemy