3

我正在开发一个框架,我已将大量日志记录整个过程中。我使用温莎城堡的ILogger通过此属性的模式:将Windsor日志记录工具安装到库中

namespace Framework 
{ 
    public class SomeClass 
    { 
     private ILogger _logger = NullLogger.Instance; 
     public ILogger Logger 
     { 
      get { return _logger; } 
      set { _logger = value; } 
     } 

     public void DoSomething() 
     { 
      Logger.Info("Doing something."); 
     } 

     //... 

    } 
} 

我也从框架内提供了一个安装程序:

namespace MyFramework 
{ 
    public class LoggerInstaller : IWindsorInstaller 
    { 
     private readonly string _configPath; 

     public LoggerInstaller(string configPath) 
     { 
      _configPath = configPath; 
     } 

     public void Install(IWindsorContainer container, IConfigurationStore store) 
     { 
      container.AddFacility("logging", new LoggingFacility(LoggerImplementation.Log4net, _configPath)); 
      //I've also tried this one: 
      //container.AddFacility<LoggingFacility>(f => f.LogUsing(LoggerImplementation.Log4net).WithConfig(_configPath)); 
     } 
    } 
} 

这个项目,然后从其他项目中引用。例如,在测试项目中,我将通过首先安装记录器来构建测试。我这样做有一个抽象类,我所有的长时间运行测试扩展:

namespace Framework.Test 
{ 
    public abstract class Log4NetLoggedTest 
    { 
     private const string ConfigFilePath = "log4net.config"; 
     protected ILogger Logger { get; set; } 
     protected IWindsorContainer Container { get; set; } 

     protected Log4NetLoggedTest() 
     { 
      Container = new WindsorContainer(); 

      Container.Install(new LoggerInstaller(ConfigFilePath)); 

      Logger = Container.Resolve<ILogger>(); 
     } 

     ~Log4NetLoggedTest() 
     { 
      Container.Dispose(); 
     } 
    } 
} 

让我的测试是这样的:

namespace Framework.Test 
{ 
    [TestFixture] 
    public class MyLongRunningTest : Log4NetLoggedTest 
    { 
     [Test] 
     [Category("LongRunning")] 
     public void ModelConvergesForS50() 
     { 
      Logger.Info("Starting test..."); 

      var obj = new SomeClass(); 
      obj.DoSomething(); 

      // ... 
     } 
    } 
} 

测试的ILogger记录器得到解决,并正确设置,所以在这个例子我得到了“开始测试...”,但不是“做某事”。 SomeClass的ILogger保持为NullLogger。

请帮忙!

回答

2

您正在使用'new'实例化SomeObj,而不是通过容器。如果你没有通过容器,它不能注入依赖关系。

+0

你达人。谢谢罗伯特。 – D3C34C34D

0

我可能会说一些愚蠢的事,但是,不应该是这样的:

namespace Framework.Test 
{ 
    [TestFixture] 
    public class MyLongRunningTest : Log4NetLoggedTest 
    { 
     [Test] 
     [Category("LongRunning")] 
     public void ModelConvergesForS50() 
     { 
      Logger.Info("Starting test..."); 

      var obj = new SomeClass(); 
      obj.Logger = Logger; 
      obj.DoSomething(); 

      // ... 
     } 
    } 
} 

我看不出你将你的类中使用的任何地方记录的该实例。

+0

你也可以在构造函数中使用。 SomeClass(Logger) –

+0

伐木是一个交叉问题,所以你不应该手动做构造函数或属性注入:参见[link](http://devlicio.us/blogs/casey/archive/2008/06/18 /logging-with-castle-windsor-the-logging-facility-and-log4net.aspx)。这是Castle Windsor Logging Facility的全部点 – D3C34C34D

相关问题