2017-10-19 3 views
0

현재 Ninject, Log4Net 및 Nancy를 사용하는 응용 프로그램을 사용하고 있습니다.Ninject, Log4Net 및 Nancy를 사용하여 ILogger 주입

내가 겪고있는 문제는 ILogger의 모든 주입 된 인스턴스에 Web.config에서 제공하는 Log4Net 구성을 유지하는 가장 좋은 방법을 결정하는 것입니다.

어떤 상황이 응용 프로그램 내

, 우리는 자동으로 Ninject.Extensions.Logging에서 제공하는 Log4NetModule를로드하는 하나의 Ninject에 StandardKernel을 구성

우리의 낸시 부트 스트 래퍼 클래스는 상속 위의 사용 this project

를 사용 NinjectNancyBootstrapper에서 접근 방식을 사용하면 다음 속성을 성공적으로 확인할 수 있습니다.

/// <summary> 
/// Injected Logger 
/// </summary> 
[Inject] 
public ILogger Logger { get; set; } 

Web.config에서 제공하는 Log4Net 구성을 사용합니다.

은, 우리가 XmlConfigurator 실행되는 정적 StandardKernel의 생성 직전 : 나의 이해에서

log4net.Config.XmlConfigurator.Configure(); 
_kernel = new StandardKernel(); 

을,이 구성 프로그램은 틀림없이 잘못 될 수있는 (응용 프로그램에서 한 번 호출 할 필요합니다), ILogger 인스턴스를 만들기 전에. 내 응용 프로그램을 시작할 때, 주입되는 ILogger의 첫 번째 인스턴스에는 내가 예상하는 포함 된 appenders가 있습니다. 이후의 모든 호출은 여전히 ​​종속성을 성공적으로 해결하지만 첫 번째 구성에 대한 부속 장치가 없습니다. XmlConfigurator이 처음 생성 된 ILogger에만 적용된다는 의도 된 동작이 있습니까? 이 기능은 전체 애플리케이션에 단일 ILogger를 사용하는 경우에 효과적이지만, 유형 당 적어도 하나는 필요합니다.

이 문제를 해결하기위한 초기 시도 중 하나는 XMLConfigurator를 RequestStartup 메서드에 연결하는 것이었지만 응답 시간이 거의 두 배가되는 API 호출에 상당한 오버 헤드가 추가되었습니다.

아마도이 문제는 완전히 잘못되고 있습니다.하지만 누군가에게이 문제에 대한 제안이나 해결책이 있는지 알고 싶습니다.

감사합니다.

답변

1

당신은 그냥이 같은 Ninject 뭔가에 싱글 서비스로 ILogger를 등록해야합니다

kernel.Bind<ILogger>.To<LoggerConstructor>().InSingletonScope(); 
+1

이는 좋은 제안하지만,이 경우에 나는 하나의 로거 인스턴스를 얻을 수 있었으면했다 (중 1 개 당 XML로드 오버 헤드를 발생시키지 않으면 서 요청 당 1 개). XML로드를 한 번만 실행할 수있게되었습니다. 문제가 각 요청을 스폰하는 하위 컨테이너로 끓인 것으로 보입니다. 내 nancy 요청 처리기 부모 IoC 컨테이너에서 로깅 종속성을 검색 할 수있는 사용자 지정 논리를 추가하고 지금 원하는 동작을 보인다. – Miek

관련 문제