C# 将Windsor日志记录设施安装到库中

C# 将Windsor日志记录设施安装到库中,c#,logging,dependency-injection,inversion-of-control,castle-windsor,C#,Logging,Dependency Injection,Inversion Of Control,Castle Windsor,我正在开发一个框架,在这个框架中我放了很多日志。我使用了温莎城堡的ILogger,通过以下属性模式: namespace Framework { public class SomeClass { private ILogger _logger = NullLogger.Instance; public ILogger Logger { get { return _logger; } s

我正在开发一个框架,在这个框架中我放了很多日志。我使用了温莎城堡的ILogger,通过以下属性模式:

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));
        }
    }
}
测试的ILogger得到正确的解析和设置,因此在本例中,我得到的是“开始测试…”,而不是“做点什么”。SomeClass的ILogger保持为NullLogger


请帮忙

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

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

            // ...
        }
    }
}

我看不到您在任何地方应用您在类中使用的记录器实例

您正在用“new”实例化SomeObj,而不是遍历容器。如果不遍历容器,它就无法注入可以在构造函数中使用的依赖项。SomeClass(Logger)日志记录是一个交叉关注点,因此您不必手动执行构造函数或属性注入:请参阅。这就是温莎城堡伐木设施的全部要点
namespace Framework.Test
{
    [TestFixture]
    public class MyLongRunningTest : Log4NetLoggedTest
    {
        [Test]
        [Category("LongRunning")]
        public void ModelConvergesForS50()
        {
            Logger.Info("Starting test...");

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

            // ...
        }
    }
}
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();

            // ...
        }
    }
}