2008-10-29 2 views
10

나는 Castle Windsor를 처음 보았고 로깅 시설을 들여다보고 있습니다. 그것은 상당히 인상적으로 보이지만 내가 해결할 수없는 유일한 점은 Windsor가 내 수업에 Logger 속성을 설정하는 부분입니다. 다음 코드에서와 같이 클래스가 아직 설정되지 않았지만 해결이 완료되면 로거 속성이 설정되면 Logger를 nullLogger로 설정합니다.& Castle Windsor가 로깅 시설을 설치하는 방법

private ILogger logger; 

public ILogger Logger 
{ 
    get 
    { 
     if (logger == null) 
      logger = NullLogger.Instance; 
     return logger; 
    } 
    set { logger = value; } 
} 

그래서 궁금한 점은 windsor가 내 로거 속성을 설정하는 방법과 위치입니다.

건배 안토니

답변

12

로거 구성의 <facilities> 부에 로깅 기능에 의해 설정된다. 예 log4net 사용에 대한 귀하의 응용 프로그램 또는 Web.config의이 같은 보일 것이다 : 당신은 세터와 공용 속성을 가지고 있기 때문에

<?xml version="1.0"?> 
<configuration> 
    <configSections> 
     <section name="castle" type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor"/> 
    </configSections> 
<Configuration> 

<castle> 

    <facilities> 
     <facility id="loggingfacility" 
      type="Castle.Facilities.Logging.LoggingFacility, Castle.Facilities.Logging" 
      loggingApi="log4net" 
      configFile="logging.config" /> 
    </facilities> 

</castle> 
</configuration> 
1

은, 때마다 당신은 윈저에서 개체를 해결하기를, 그것도 하나를 설정하려고합니다 컨테이너에서 적절한 값을 가진 공개 속성 (사용자의 경우 시설이 Windsor에 채워지는 ILogger).

의미, 윈저에서 클래스를 해결하면이 설정됩니다. 하지만 당신이 새로운 Class()를한다면.

나는 그것을 이해하는 방법을 적어도 athere.

다른 방법은 당신이

공공 클래스 (ILogger입니다 로거)라는 이름의 생성자가있는 경우이 매개 변수로 ILogger입니다 인스턴스화됩니다 의미 생성자를 사용하는 것입니다.

예 :

 

var yourClassObject = Kernel.Resolve<IClass>(); 

당신은 인터페이스 사양 (와 같은 등록) 당신이 구체적인 유형 것을 사용하여 해결하려는 경우, 당신은 구체적인 유형으로 구성 요소를 등록해야합니다이없는 경우 (인터페이스가 아닌).

container.AddFacility("logging", new LoggingFacility(LoggerImplementation.Log4net)); 

당신은 물론 로거 implimentations 중 하나를 선택할 수 있습니다 (예를 들어, 당신의 global.asax.cs에서) 윈저을 초기화 할 때

+0

여기 컨테이너에서 클래스를 확인하는 예제를 볼 수 있습니다. – OutOFTouch

+0

간단한 예가 추가되었습니다. – jishi

+0

감사합니다. 이것은 내가 당신이 말한 것을 이해했다는 것을 확인시켜줍니다. – OutOFTouch

11

은 또한, 프로그램이 구성 할 수 있습니다.

이것은 윈저가 로거를 기대하는 클래스를 인스턴스화 할 때마다 유선 연결됩니다. 저는 이것을 교차 생성 문제로 생각하지 않습니다. 제 생각에 제안한 것처럼하는 것이 좋습니다. 약간 단순화 할 수 있습니다 :

private ILogger logger = NullLogger.Instance; 
    public ILogger Logger 
    { 
     get { return logger; } 
     set { logger = value; } 
    } 
+1

게터가 중복되었습니다. 이 속성이 존재하는 유일한 이유는 Windsor가 기본 null 로거를 무시할 수 있기 때문입니다. – IanT8

관련 문제