Внедрение настроек приложения с помощью 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, а не в Виндзоре.
Я, конечно, не первый человек, у которого есть эта проблема, поэтому я хотел бы знать, как другие люди решили эту проблему?
Ответы
Ответ 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.