Установка Windsor Logging Facility в библиотеку - PullRequest
3 голосов
/ 01 декабря 2011

Я разрабатываю фреймворк, в который я поместил много логов. Я использовал 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 разрешается и устанавливается правильно, поэтому в этом примере я получаю «Начало теста ...», а не «Делать что-то». ILogger SomeClass остается в качестве NullLogger.

Пожалуйста, помогите!

Ответы [ 2 ]

2 голосов
/ 01 декабря 2011

Вы создаете экземпляр SomeObj с 'новым', а не проходите через контейнер. Если вы не пройдете через контейнер, он не сможет внедрить зависимость

0 голосов
/ 01 декабря 2011

Возможно, я говорю что-то глупое, но не должно быть что-то вроде:

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

            // ...
        }
    }
}

Я не мог видеть, чтобы вы применяли тот экземпляр регистратора, который вы используете внутри класса где-либо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...