将Windsor Logging Facility安装到图书馆

本文关键字:图书馆 安装 Facility Windsor Logging | 更新日期: 2023-09-27 18:16:33

我正在开发一个框架,我在其中放置了大量的日志记录。我通过以下属性模式使用了Castle Windsor的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));
        }
    }
}

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

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 Logger得到了正确的解析和设置,所以在这个例子中,我得到的是"Starting test…",而不是"Doing something"。SomeClass的ILogger保持为NullLogger。

请帮忙!

将Windsor Logging Facility安装到图书馆

您正在实例化SomeObj与'new',而不是通过容器。如果你不遍历容器,它就不能注入依赖项

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

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

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