Могу ли я использовать функцию Castle Logging на этапе регистрации?

Я использую лесозаготовительную площадку Castle Windsor, и она отлично работает. У меня есть установщик, который регистрирует перехватчик плюс средство для подключения к событиям, так что я могу держать большую часть моего кода в блаженном неведении ни о Castle, ни о log4net.

Большая часть моей регистрации происходит в коде, но для регистрации я подключаю его в web.config (который устанавливается первым) следующим образом:

<castle>        
    <facilities>
         <facility id="logging"
              type="Castle.Facilities.Logging.LoggingFacility, Castle.Facilities.Logging" loggingApi="log4net" />
    </facilities>
    <installers>
        <install type="MyProject.LoggerInstaller,MyProject" />
    </installers>
</castle>

Причина в том, что мне не нужно включать этот раздел конфигурации, когда я перехожу к производству. Это также означает, что я могу очень легко переключаться с log4net на nlog на все, что нам может понадобиться на лету. Это означает, что ни один из моих компонентов не должен напрямую ссылаться на log4net.

Проблема, с которой я столкнулся, заключается в том, что я хотел бы использовать ведение журнала на этапе регистрации. Я делаю это, потому что регистрация немного сложна, и я хочу иметь возможность легко следить за тем, что происходит и сколько времени это занимает. (В основном потому, что у меня есть система типов плагинов.)

В моем LoggerInstaller я пытаюсь разрешить ILoggerFactory, чтобы я мог создать регистратор и подключить некоторые события для него в моем служебном объекте. Но это не сработает:

ComponentNotFoundException: No component for supporting the service Castle.Core.Logging.ILoggerFactory was found

Покопавшись в исходном коде Castle, я думаю, что все установщики устанавливаются раньше, чем какие-либо средства, поэтому кажется, что средство не было инициализировано внутри моего установщика. Если я создам второй установщик только для того, чтобы подключать события, чтобы этого не происходило через конфигурацию XML, тогда он работает, но я хотел бы, чтобы все журналы были связаны вместе - и нет смысла подключать события, если ведение журнала не нет в наличии. (И мне нужно как-то выяснить, включено ли ведение журнала .. ??)

В идеале я хотел бы зарегистрировать средство ведения журнала Castle из моего установщика, но я не знаю, как завершить его настраиваемые элементы. (Или хочу ли я.)

Есть способ попроще? Я подозреваю, что я не делаю того, что обычно является хорошей идеей, поскольку я знаю, что на самом деле мне не следует решать на этапе регистрации. Но я думаю, что установка достаточно сложна, чтобы потребовать небольшого протоколирования.

Кто-нибудь еще делал подобное раньше? Любая помощь (или переход на более праведный путь!) Будет очень благодарна.


person John    schedule 17.05.2013    source источник


Ответы (1)


Если проблема действительно в том, что регистрация фабрики регистраторов произойдет только после того, как установщики завершат работу, вы можете попробовать следующее:

Сделайте 2 раздела конфигурации castle1 castle2.

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

<castle2>        
    <installers>
        <install type="MyProject.LoggerInstaller,MyProject" />
    </installers>
</castle2>

и инициализировать контейнер за 2 шага:

container.Install(new ConfigurationInstaller(new XmlInterpreter(new ConfigResource("castle1"))));
container.Install(new ConfigurationInstaller(new XmlInterpreter(new ConfigResource("castle2"))));

Также в верхней части файла конфигурации вы должны указать разделы castle1 и castle2.

Не пробовал, но думаю попробовать стоит.

С уважением, Марвейн

person Marwijn    schedule 17.05.2013
comment
Спасибо! Я попробовал это сегодня утром, и он отлично работает! - person John; 20.05.2013