Где и как Замок Виндзор создает лесозаготовительные сооружения - PullRequest
10 голосов
/ 29 октября 2008

Я довольно новичок в замке Виндзор и смотрю на вход и выход из лесозаготовительной базы. Это выглядит довольно впечатляюще, но единственное, что я не могу понять, это то, где Виндзор устанавливает свойство Logger для моих классов. Как и в следующем коде, для Logger будет установлено значение nullLogger, если класс еще не настроен, но когда Resolve завершает работу, устанавливается свойство Logger.

private ILogger logger;

public ILogger Logger
{
    get
    {
        if (logger == null) 
            logger = NullLogger.Instance;
        return logger;
    }
    set { logger = value; }
}

Так что мне интересно, как и где windsor устанавливает мое свойство Logger.

Приветствие Anthony

Ответы [ 3 ]

12 голосов
/ 29 октября 2008

Регистратор настраивается средством регистрации, которое находится в разделе <facilities> конфигурации. Например, для использования log4net ваше приложение или web.config будет выглядеть примерно так:

<?xml version="1.0"?>
<configuration>
    <configSections>
        <section name="castle" type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor"/>
    </configSections>
<Configuration>

<castle>

    <facilities>
        <facility id="loggingfacility" 
             type="Castle.Facilities.Logging.LoggingFacility, Castle.Facilities.Logging" 
             loggingApi="log4net" 
             configFile="logging.config" />
    </facilities>

</castle>
</configuration>
11 голосов
/ 15 октября 2009

Вы также можете настроить это программно при инициализации windsor (например, из вашего global.asax.cs):

container.AddFacility("logging",  new LoggingFacility(LoggerImplementation.Log4net));

Вы, конечно, можете выбрать любое из значений логгера.

Это будет установлено всякий раз, когда windsor создает экземпляр любого класса, ожидающего регистратор. Я бы не стал вкладывать это в конструктор, так как это сквозная задача - лучше поступить так, как вы предложили, по моему мнению. Вы можете немного упростить это:

    private ILogger logger = NullLogger.Instance;
    public ILogger Logger
    {
        get { return logger; }
        set { logger = value; }
    }
1 голос
/ 03 ноября 2008

Так как у вас есть открытое свойство с помощью Setter, каждый раз, когда вы разрешаете свой объект из Windsor, он также будет пытаться установить любые открытые свойства с соответствующими значениями из контейнера (в вашем случае, ILogger, в который будет добавлено ваше средство Windsor).

Значение, если вы разрешите Класс из Виндзора, это будет установлено. Но нет, если вы делаете новый класс ().

Это по крайней мере, как я понимаю.

Другой подход заключается в использовании конструкторов, то есть, если у вас есть конструктор с именем

открытый класс (регистратор ILogger), он будет создан с параметром ILogger.

Пример:


var yourClassObject = Kernel.Resolve<IClass>();

Если у вас нет спецификации интерфейса (и не зарегистрированы как таковой), вам необходимо зарегистрировать свой компонент как конкретный тип, если вы хотите разрешить его, используя этот конкретный тип (а не по интерфейсу).

...