Вставить настройки приложения с помощью Windsor
-
05-07-2019 - |
Вопрос
Как я могу ввести значение записи 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>
Однако я действительно хотел бы взять значение, представленное # {важныйIntegerProperty}
, из переменной настроек приложения, которая может быть определена следующим образом:
<appSettings>
<add key="importantInteger" value="666"/>
</appSettings>
РЕДАКТИРОВАТЬ: чтобы уточнить; Я понимаю, что это изначально невозможно с Виндзором и Дэвидом Хейденом статья , на которую ссылается sliderhouserules , на самом деле касается его собственного контейнера IoC (Дэвида Хейдена), а не Виндзора. р>
Я, конечно, не первый, у кого возникла эта проблема, поэтому я хотел бы знать, как другие люди решили эту проблему?
Решение
Я придумала решение для этого, основанное на подсказках из разных источников в Интернете. Конечный результат, хотя и в значительной степени включал в себя копирование трех классов из дословно Виндзора и их небольшую модификацию. Конечный результат - на кодплексе для вашего удовольствия.
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>
... и получите к нему доступ из своего конфигурационного файла Windsor XML следующим образом:
<?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>
В решении есть рабочий пример.
Другие советы
Я написал сообщение о похожем случае пару месяцев назад. Он использует SubDependencyResolver, чтобы ввести соответствующие параметры. В вашем случае вы можете просто изменить DynamicConfigurationSettings для ConfigurationManager.