2014-04-08 199 views
2

我有一個.NET MVC4項目,我想用我的記錄器包裝NLOG(我有理由),並將其注入Castle Windsor。我嘗試下面的東西。我沒有機會成功地完成它。溫莎城堡包裝NLOG

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); 
    } 

} 

 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圖像錯誤。

如果我直接用NLOG與

container.AddFacility<LoggingFacility>(f => f.UseNLog()); 

它與城堡ILogger實現,但我希望它爲自己的ICommonLogger implemantation工作。

我做錯了什麼?

回答

1

我認爲你不應該使用LogManager.GetLogger(loggerName, loggerType)過載。該重載特別適用於通過繼承記錄器來擴展NLog。在這種情況下,loggerType是指您的子類記錄器的類型。在你的情況下,你不是繼承記錄器。相反,你正在包裝它。

在您的CommonLogger構造函數中,Type參數引用了什麼對象?

public CommonLogger(Type loggerType) 

這實際上是Castle爲您創造的物體類型嗎?也就是說,該類型是否與您的某個域對象相對應?而不是Logger創建的實際類型?這似乎是因爲錯誤消息說GetLogger正在嘗試創建LogInController的一個實例。

你CommonLogger構造或許應該是這個樣子:

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

你可能要到城堡的資源庫,看看他們如何實現他們的NLOG包裝以及相應的解析器。

+0

非常感謝。 –