Как считывать / разрешать свойства из конфига Castle Windsor - PullRequest
5 голосов
/ 15 октября 2008

У меня есть много конфигов Castle XML, где такие свойства, как строка подключения, также содержатся в разделах конфигурации .Net.

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

т.е.

<castle>
  <configuration>
    <properties>
      <connectionString>Data Source=MyServer;Initial Catalog=YadaYada;User      ID=me;Password=IAmGod</connectionString>
     </properties>
    <components>

...

Очевидно, что свойства есть, поскольку есть зависимости компонентов от них. Я могу разрешить компоненты, но не свойства.

Конечно, я мог бы создать новый компонент просто для считывания введенного им замком свойства, или я мог бы обернуть все свойства в специализированном компоненте просто для хранения пар имя / значение. Но я бы подумал, что существует простая запись container.resolve ("property.connectionstring").

* Редактировать Не очень хорошо с уценкой, выше должен был быть раздел XML.

Ответы [ 2 ]

2 голосов
/ 24 октября 2008

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

Другой альтернативой может быть использование существующего интерпретатора конфигурации и предоставление свойств, которые собираются во время анализа конфигурации - для их решения потребуется немного работы (но не слишком много). Я думаю, вы могли бы сделать это по:

  • Создание декоратора, реализующего IXmlProcessorEngine, который захватывает вызовы AddProperty (элемент XmlElement) и сохраняет элементы в своем собственном частном словаре.
  • Замените XmlProcessor вашей собственной реализацией (то есть скопируйте исходный код для класса, затем измените конструктор, чтобы обернуть декоратор вокруг экземпляра DefaultXmlProcessorEngine, который выполняет фактическую работу, чтобы записывались различные вызовы add-property) .
  • Унаследуйте от XmlInterpreter и переопределите метод ProcessResource, чтобы он вызывал замену вашего XmlProcessor.
  • Решите, как вы хотите получить свойства, сохраняемые вашим декоратором, возможно, он настроен со словарем, который передается через конструктор из XmlInterpreter и XmlProcessor по очереди.

К сожалению, AFAIK эти свойства не передаются в хранилище конфигурации, потому что они используются только на этапе интерпретации - к тому же я не верю, что преобразователи типов вызываются на этом этапе анализа, поэтому значения будут быть строками, но по крайней мере операторы условия if / else и т.д. будут оцениваться правильно, а также включать.

1 голос
/ 15 октября 2008

Не думаете ли вы об этом неправильно?

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

<component type="SessionManager">
  <parameters>
    <connectionString>#{connectionString}</connectionString>
  </parameters>
</component>

Таким образом, строка подключения будет автоматически передана, и вашему компоненту вообще не нужно будет знать о контейнере - отделенном и связном !!!

...