2014-04-08 1 views
2

저는 .NET MVC4 프로젝트를 가지고 있으며, 로거와 함께 NLOG를 포장하고 Castle Windsor가 주입하려고합니다. 나는 다음과 같은 것을 시도한다. 나는 성공적으로 그것을 다룰 수있는 기회가 없었다. 캐슬 윈저에 NLOG 배치하기


 container.Register(Component.For<ICommonLogger>().ImplementedBy(typeof(CommonLogger)).LifeStyle.Transient); 
     container.Kernel.Resolver.AddSubResolver(new LoggerResolver(container.Kernel)); 

public class LoggerResolver : ISubDependencyResolver 
{ 
    private readonly IKernel kernel; 

    public LoggerResolver(IKernel kernel) 
    { 
     this.kernel = kernel; 
    } 

    public bool CanResolve(CreationContext context, 
          ISubDependencyResolver contextHandlerResolver, 
          ComponentModel model, 
          DependencyModel dependency) 
    { 
     return dependency.TargetType == typeof(ICommonLogger); 
    } 

    public object Resolve(CreationContext context, 
          ISubDependencyResolver contextHandlerResolver, 
          ComponentModel model, 
          DependencyModel dependency) 
    { 
     if (CanResolve(context, contextHandlerResolver, model, dependency)) 
     { 
      return kernel.Resolve<ICommonLogger>(new { loggerType = model.Implementation }); 
     } 

     return null; 
    } 
} 

하지만 enter image description here 이미지 오류를 얻고있다

public interface ICommonLogger 
{ 
    void Info(string message); 

} 

public class CommonLogger : ICommonLogger 
{ 
    private readonly Logger _logger; 

    public CommonLogger(Type loggerType) 
    { 
     _logger = LogManager.GetLogger(loggerType.FullName, loggerType); 
    } 

    public void Info(string message) 
    { 
     _logger.Info(message); 
    } 

} 

.

나는

그것은 성하는 ILogger 구현과 작동
container.AddFacility<LoggingFacility>(f => f.UseNLog()); 

직접 NLOG를 사용하지만 나는 그것이 자신의 ICommonLogger의 implemantation 위해 일합니다.

내가 뭘 잘못하고 있니?

답변

1

나는 과부하 LogManager.GetLogger(loggerName, loggerType)을 사용하면 안된다고 생각합니다. 그 오버로드는 Logger를 서브 클래스 화하여 NLog를 확장 할 때 특히 유용합니다. 그 맥락에서 loggerType은 서브 클래 싱 된 로거의 유형을 참조합니다. 귀하의 경우 Logger를 하위 클래스 화하지 않습니다. 오히려 그것을 포장하고 있습니다.

CommonLogger 생성자에서 Type 매개 변수는 어떤 객체를 참조합니까?

public CommonLogger(Type loggerType) 

실제로 성이 당신을 위해 만드는 대상 유형입니까? 즉, 해당 유형이 도메인 객체 중 하나와 일치합니까? 로거의 실제 유형을 생성하는 것과 반대로? GetLogger가 LogInController의 인스턴스를 만들려고한다는 오류 메시지가 표시되는 것으로 보입니다.

귀하의 CommonLogger 생성자는 아마 다음과 비슷한 모습이 될 것입니다

public CommonLogger(Type typeOfObjectThatWantsALogger) 
{ 
    _logger = LogManager.GetLogger(typeOfObjectThatWantsALogger.FullName); 
} 

당신은 성의 저장소에 가서 그들의 NLog 래퍼와 해당 해결 프로그램을 구현하는 방법을 살펴 할 수 있습니다.

+0

대단히 감사합니다. –