2015-11-26 8 views
6

Mam starą klasę strażniczą - to stałe lub statyczne metody, typowe dla klasy użytkowej.Metody statyczne w instancji klasy - dobre, złe lub zależne?

Jednak ostatnio zacząłem używać NLog - więc moi strażnicy mogą teraz logować się i rzucać. Chodzi o to, ze nlog że każda klasa wywołujący (gdzie przebywa strażnik) tworzy własny rejestrator, więc zamiast metody takie jak to:

public static void NotNull<T>(T obj, string param) 
{ 
    if (obj.Equals(null)) 
     throw new ArgumentNullException(param); 
} 

Mam metodę z podpisem jak ten:

public static void NotNull<T>(T obj, string param, Logger logger, LogLevel logLevel) 
{ 
} 

Teraz wszystkie moje metody zawierają dwa takie same parametry związane z rejestratorem, więc prawie zdecydowałem, że wstrzyknięcie zależności byłoby lepszym rozwiązaniem, przekazując rejestrator do konstruktora i przechodząc do metody.

Pytanie, które mam, opiera się na moim niedoświadczeniu - moja nowa klasa nie będzie statyczna, ale czy powinienem pozostawić metody w środku jako statyczne?

+0

Nie musisz tworzyć nowej instancji rejestratora dla każdej instancji klasy. Spójrz na [tę odpowiedź] (http://stackoverflow.com/a/9071875/728795) na przykład, dobrze jest mieć pole statycznego rejestratora, lub jakiś dostawca dziennika – Andrei

+2

Twoja metoda "NotNull" zgłasza wyjątek NullReferenceException 'jeśli 'obj' ma wartość null, a nie' ArgumentNullException'. – Lee

+0

@Andrei Jeśli nie używasz rejestratora dla każdej klasy, dzienniki nie są tak szczegółowe w odniesieniu do przestrzeni nazw. –

Odpowiedz

6

Wygląda na to, że nie trzeba w ogóle przechodzić w rejestratorze. To dobrze, a nie wbrew powszechnej praktyce, aby mieć statyczne pole rejestratora (spójrz na this answer), aby było ono współużytkowane we wszystkich instancjach klasy. Rozważ:

public static class Utils 
{ 
    private static readonly ILog Log = LogManager.GetLogger(typeof(Utils)); 

    public static void NotNull<T>(T obj, string param) 
    { 
     Log.Debug("Huston, we got a null."); 
     if (obj.Equals(null)) 
      throw new ArgumentNullException(param); 
    } 
} 
+0

Dostaję to, o co prosisz teraz Andrei - ale w tym scenariuszu, o ile mi wiadomo, z jednym loggerem, wszystkie błędy są rejestrowane do dziennika w pliku dziennika o tej samej przestrzeni nazw, co MyNameSpace.Utils | MyObj ma wartość null –

+1

Wystarczy dodać do powyższego - jest to problem, ponieważ null nie orginate w utils, to było albo klasy A albo B –

+0

W porządku, więc chcesz logger, aby zalogować wpis w przestrzeni nazw klasy 'T '? – Andrei

Powiązane problemy