Где и как Замок Виндзор создает лесозаготовительные сооружения
Я довольно новичок в замке Виндзор и смотрю на вход и выход из лесозаготовительной базы. Это выглядит довольно впечатляюще, но единственное, что я не могу понять, это то, где Виндзор устанавливает свойство 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.
Ура Энтони
3 ответа
Регистратор настроен средством регистрации, которое находится в <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>
Вы также можете настроить это программно при инициализации 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; }
}
Поскольку у вас есть общедоступное свойство с установщиком, каждый раз, когда вы разрешаете свой объект из Windsor, он также будет пытаться установить любые общедоступные свойства с соответствующими значениями из контейнера (в вашем случае, ILogger, который ваше средство будет заполнять в Windsor).
Это означает, что если вы разрешите Класс из Виндзора, это будет установлено. Но нет, если вы делаете новый класс ().
Это по крайней мере, как я понимаю.
Другой подход заключается в использовании конструкторов, то есть, если у вас есть конструктор с именем
Открытый класс (регистратор ILogger) будет создан с параметром ILogger.
Пример:
var yourClassObject = Kernel.Resolve();
Если у вас нет спецификации интерфейса (и не зарегистрированы как таковой), вам нужно будет зарегистрировать свой компонент как конкретный тип, если вы хотите разрешить его, используя этот конкретный тип (а не через интерфейс).