Подтвердить что ты не робот

Внедрение настроек приложения с помощью Windsor

Как я могу вставить значение записи appSettings (из app.config или web.config) в службу, используя контейнер Windsor? Если бы я хотел ввести значение свойства Windsor в службу, я бы сделал что-то вроде этого:

<properties>
    <importantIntegerProperty>666</importantIntegerProperty>
</properties>
<component
    id="myComponent"
    service="MyApp.IService, MyApp"
    type="MyApp.Service, MyApp"
    >
    <parameters>
        <importantInteger>#{importantIntegerProperty}</importantInteger>
    </parameters>
</component>

Однако, что мне действительно нужно сделать, это принять значение, представленное #{importantIntegerProperty} из переменной параметров приложения, которая может быть определена следующим образом:

<appSettings>
    <add key="importantInteger" value="666"/>
</appSettings>

EDIT: Чтобы уточнить; Я понимаю, что это невозможно из-за Виндзора и статьи Дэвида Хайдена, что sliderhouserules означает фактически о его собственном (David Hayden's) контейнере IoC, а не в Виндзоре.

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

4b9b3361

Ответ 1

Я придумал решение для этого, в конце концов, основанное на подсказках из разных источников в Интернете. Конечный результат, хотя и в значительной степени копировал три класса из Windsor verbatim и немного их модифицировал. Конечный результат зависит от кода для вашего удовольствия.

http://windsorappcfgprops.codeplex.com/

Я изначально написал этот код некоторое время назад, поэтому он основан на Windsor 1.0.3 - да, мне потребовалось столько времени, чтобы обойти публикацию результата!

Код позволяет получить это в вашем app.config(или web.config, очевидно):

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="theAnswer" value="42"/>
  </appSettings>
</configuration>

... и получить доступ к нему из вашего конфигурационного файла XML Windsor следующим образом:

<?xml version="1.0" encoding="utf-8" ?>
<castle>
  <components>
    <component
      id="answerProvider"
      service="Acme.IAnswerProvider, Acme"
      type="Acme.AnswerProvider, Acme"
      >
      <parameters>
        <theAnswer>#{AppSetting.theAnswer}</theAnswer>
      </parameters>
    </component>
  </components>
</castle>

В решении есть рабочий пример.

Ответ 2

I написал сообщение об аналогичном случае пару месяцев назад. Он использует SubDependencyResolver для ввода соответствующих параметров. В вашем случае вы можете просто изменить DynamicConfigurationSettings для ConfigurationManager.