2013-12-23 6 views
1

내가 log4net를 사용하고 있습니다에서 선언을 통해 현재 클래스 가져 오기 및 사용을 단순화합니다. 내가 정말하고 싶은 무엇상속 클래스

public class MyClass 
{ 
    public static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 

    try 
    { 
     // do something 
    } 
    catch(Exception ex) 
    { 
     log.Error("Problem doing something", ex); 
    } 
} 

이있는 내가 할 수있는, 다른 클래스의 첫 번째 선언을 배치하는 것입니다 : 바로 지금, 내가 (거의 모든 모든 클래스 인) 로깅을 사용할 때마다 클래스에서, 나는 쓸 필요가 나는이 작업을 수행 할 경우, 문제는

System.Reflection.MethodBase.GetCurrentMethod().DeclaringType 

이 ... 로그에 대한 좋은하지 않습니다 클래스 이름 로깅을 따기 끝나는 것입니다,

public class MyClass : Logging 
{ 
    try 
    { 
     // do something 
    } 
    catch(Exception ex) 
    { 
     log.Error("Problem doing something", ex); 
    } 
} 

public class Logging 
{ 
    public static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 
} 

그러나 : I 로깅을 필요로 어디든지 상속 . 상속 된 로깅 클래스가 사용되는 클래스의 클래스 이름을 가져 오려면 어떻게해야합니까?

감사합니다.

+0

을 당신이 상속을 사용하지한다고 생각을하지만, 귀하의 문제에 대한 구성. – Rafa

+1

@Anders는 : Yevgeniy.Chernobrivets' @ 이미 답'로 ... ... – Moumit

답변

4

로깅 클래스에서 모든 클래스를 상속하는 경우 C#은 다중 상속을 지원하지 않으므로 다른 클래스의 클래스를 상속받지 않고 상속 구조를 만들 수 있습니다. 상속이 아니라 구성을 사용해야합니다.

당신은 정적 헬퍼 클래스 작성하여 로거에 대한 호출을 단순화 할 수

: 당신이 클래스에 다음

public static class LoggerHelper 
{ 
    public static void WriteError(string message,Exception ex, Type type) 
    { 
     var log = log4net.LogManager.GetLogger(type); 
     log.Error(message, ex); 
    } 
} 

그리고 당신은 다음과 같이 호출합니다 :

public class MyClass 
{ 
    try 
    { 
     // do something 
    } 
    catch(Exception ex) 
    { 
     LoggerHelper.WriteError("Problem doing something", ex, this.GetType()); 
    } 
} 
+0

감사합니다. 좋은 해결책입니다. 그리고 당신이 옳다고 (다른 사람들도 지적한 것처럼), 상속은 이해가되지 않습니다. – Anders

+0

??? 정적 클래스 내부의 비 정적 메서드? 메서드 내에서 public static 로컬 변수? – sgmoore

+0

죄송합니다. 고쳐 주셨습니다. 의견을 주셔서 감사합니다. –

0

그래서 당신은 모든 클래스가 Logging에서 상속 할거야? 상속은 코드 재사용을위한 것이 아니라 두 도메인 엔터티 간의 "일종의 관계"를 나타 내기위한 것입니다. 그것을 남용하지 마십시오. 당신이 필요로하는 무엇

조성입니다.

public class MyClass 
{ 
    private static readonly ILog log = LogManager.GetLogger(typeof(MyClass)); 
} 

MyClass 로거 아닌, 로거가 있습니다.

+0

감사를 대신 정적 method''와'정적 class' 사용 - 포인트 촬영. 이미 가지고있는 솔루션과 동일한 솔루션을 보여줍니다. 그냥 깨끗한 방법으로 생각했습니다. 당신이 그것을 _cleaner_ 만들고 싶어 – Anders

+3

@Anders는, 당신은 "의존성 주입"살펴보고, 다음 성 윈저 같은 일부 IOC의 프레임 워크를 사용하고 수업에 로거를 주입해야 할 수 있습니다. – dcastro

0

지금처럼 기본 클래스를 선언 :

public abstract class Logging 
{ 
    public readonly log4net.ILog log = log4net.LogManager.GetLogger(this.GetType()); 
} 

this.GetType() 항상 구체적인 유형을 반환합니다.