2013-05-17 2 views
0

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

Большая часть моей регистрации происходит в коде, но для протоколирования я закреплять его в 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 

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

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

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

Неужели кто-то еще делал это раньше? Любая помощь (или руководство на более праведный путь!) Была бы высоко оценена.

ответ

1

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

Make 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.

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

С наилучшими пожеланиями, Marwijn

+0

Спасибо! Сегодня утром я попытался это сделать, и он отлично работает! – John

Смежные вопросы