2009-02-06 5 views
26

로깅 및 로깅 프레임 워크 및 종속성 주입과 관련된 모범 사례가 무엇인지 궁금합니다. 특히, 로그 할 방법이 필요한 클래스를 디자인 할 경우 종속성 주입을 염두에두고 로그인 할 수있는 인터페이스를 얻으려면 어떻게해야합니까?종속성 삽입 및 로깅 인터페이스

종속성 주입은 외부 종속성이 외부 (생성자 또는 속성 설정자)에서 주입되어야한다고 말하기 때문에 생성자에서 ILog 인스턴스를 가져와 클래스에 사용해야합니까? 옵션 종속성을 로깅하여 세터에서 가져와야합니까? 로깅 인터페이스를 변경함으로써 너무 많은 유연성을 요구하고 특정 로깅 인터페이스 (예 : 팩토리 메소드 호출을 통해 정적 ILog 변수를 작성)에 대한 의존성을 고 려해야합니까? 이 factory 메소드가 ILog 구현을 얻기 위해 컨테이너를 호출 할 수 있습니까? 아니면 초기화되는 정적 변수와 IoC 컨테이너가 초기화 될 때 초기화 충돌이 발생합니까?

나는이 일을해야합니다

public class MyService : ISomeService 
{ 
    private static readonly ILogger s_log = 
      LoggingFactory.GetLogger(typeof(MyService)) 
    ... 
} 

혹은이 :

public class MyService : ISomeService 
{ 
    protected virtual ILogger Logger {get; private set;} 
    public MyService(ILogger logger, [other dependencies]) 
    { 
    Logger = logger; 
    } 
} 

또는이 :

public class MyService : ISomeService 
{ 
    public virtual ILogger Logger {get; set;} 
    public MyService() 
    { 
    } 
} 

다른 패턴이나 방법이 작업을 수행 할 수 있습니까? 밖에있는 사람들은 무엇입니까? 무엇이 언제 작동합니까?

+0

서비스 용 로거의 중요성 여부에 따라 두 번째 또는 세 번째 옵션을 선택합니다. – toad

답변

4

Inversion of Control 및 Dependency-Injection을 살펴 보는 것이 좋습니다.

하지만 궁금한 점은 aspect 지향 프로그래밍과 같은 또 다른 개념입니다.

.NET에는 Castle, LinFu 및 Microsoft의 Policy-Injection Application Block을 포함하여 aspect 지향 프로그래밍을 수행 할 수있는 몇 가지 좋은 프레임 워크가 있습니다. 사실, 일부 반전 컨테이너에는 일부 aspect 지향 기능이 있습니다.

이러한 개념과 도구는 로깅과 같은 문제를 코드 노이즈 측면에서 배경으로 생각하고 자동으로 처리하도록 도와줍니다.

+1

로깅은 애스펙트 지향 프로그래밍의 "안녕하세요, 세상"입니다. 확실히 교차 관심사입니다. – duffymo

+6

처리 방법 추적 및 예외는 한 가지이지만 긍정적 인 이벤트 로깅은 어떻게됩니까? 문제가 발생했을 때 기록해야하는 경고 조건은 무엇입니까? 그러나 실제 프로그램 흐름을 방해하지는 마십시오. "모든 (관련)"사례를 측면으로 설명 할 수 있습니까? – Cornelius

2

이것은 완전한 대답은 아니지만 클래스 작성자를 통해 ILog를 삽입하면 유닛 테스트를 위해 해당 로깅 프레임 워크를 조롱 할 수 있습니다. 다른 생각 ... ILog를 전달하기위한 속성 설정자는 사용자가 생성자에서 작업을 기록 할 수 없다는 것을 의미합니다. 또한 인스턴스에 유효한 ILog 인스턴스가 있는지 여부를 알지 못하는 경우 유효한 ILog 인스턴스에 대한 테스트로 모든 호출을 래핑해야합니다.

+0

+1 유닛 테스트 및 모의 객체에 대한 팁. –

0

나는 그것을 주입하고 인터페이스를 사용한다. 주로 테스트를 용이하게합니다. 소비 객체를 테스트 할 때 모의 (mock) 또는 스텁 (stub)을 대체하는 것이 더 쉽습니다.

나는 소비 클래스에 대한 로그의 중요성에 대해 생성자 또는 설정 주입을 사용했는지 여부를 기준으로합니다. 당신이 그것을 중요하게 원한다면 나는 선택자가 세터라면 생성자 주입을 선호 할 것이다.

팩터 리 메서드를 사용하여 컨테이너에서 작동하지 않는 곳은 알 수 없지만이 팩터 리 메서드의 올바른 구성에 따라 소비자 클래스를 테스트합니다.

4

내 충고는? 스스로 로깅 인터페이스를 래핑하십시오.Log4Net에 대한 의존성을 한 번 얻었고 불에 타서 많은 프로젝트를 리팩토링해야했습니다.

+0

http://stackoverflow.com/questions/940831/how-to-use-log4net-with-dependency-injection – Karsten

+0

@Karsten 로거를 삽입하더라도 여전히 사용하는 모든 프로젝트에 대한 참조를 추가해야합니다. 클래스 또는 인터페이스를 해석 할 수 있는지 여부. 콜백을 사용하는 솔루션은 구현의 100 %를 클래스가 생성 된 범위로 분리합니다. – QueueHammer