Замок Виндзор: Как подключить компонент к заводскому свойству, а не методу

#.net #xml #inversion-of-control #castle-windsor

Вопрос:

У меня есть следующий компонент

 public class MyTimer : IMyTimer {
  public MyTimer(TimeSpan timespan){...}
}
 

Где промежуток времени должен быть указан в описании свойств.Частота моего времени.

Как мне подключить это в xml-контейнере windsor? Я думал, что смогу сделать что-то подобное:

     <component id="settings"
                service="MySample.ISettings, MySample"
                type="MySample.Settings, MySample"
                factoryId="settings_dao" factoryCreate="GetSettingsForInstance">
        <parameters><instance_id>1</instance_id></parameters>
    </component>

    <component id="my_timer_frequency"
                type="System.TimeSpan"
                factoryId="settings" factoryCreate="MyTimerFrequency" />

    <component id="my_timer" 
                service="MySample.IMyTimer, MySample"
                type="MySample.MyTimer, MySample">
        <parameters><timespan>${my_timer_frequency}</timespan></parameters>         
 

но я получаю ошибку, потому что частота MyTimer является свойством, когда завод ожидает метод.

Есть ли здесь простое решение? Неужели я подхожу ко всему этому неправильно?

ИЗМЕНИТЬ: Решение определенно есть, см. Мой ответ ниже.

Ответ №1:

Решение на самом деле пришло ко мне во сне. Имейте в виду, что свойства-это не конструкция CLR, а синтаксический сахар C#. Если вы мне не верите, просто попробуйте скомпилировать

 public class MyClass {
  public object Item {
    get;
  }
  public object get_Item() {return null;}
}
 

приводит к ошибке: Тип «TestApp.MyClass» уже резервирует элемент с именем «get_Item» с теми же типами параметров

Поскольку конфигурация Xml обрабатывается во время выполнения после компиляции, мы можем просто привязаться к свойству factoryCreate путем привязки к методу, в который он компилируется, чтобы приведенный выше пример стал:

 <component id="my_timer_frequency"
                        type="System.TimeSpan"
                        factoryId="settings" factoryCreate="get_MyTimerFrequency" />
 

И вуаля!

Кто-нибудь, проголосуйте за это, так как я не могу отметить это как ответ.

Комментарии:

1. Или вы могли бы проверить форумы замка, где некоторое время назад был дан ответ на этот вопрос: forum.castleproject.org/viewtopic.php?t=4726

2. Свойства на самом деле являются конструкциями CLR. Тот факт, что компилятор C# выбирает имя метода getter get_MyProperty, является лишь деталью реализации. Другой компилятор мог бы выбрать другую схему именования, и свойство все равно существовало бы и работало. Проверьте спецификацию: msdn.microsoft.com/en-us/library/65zdfbdt(VS.71).aspx

Ответ №2:

Не было бы самым простым решением добавить метод, который обертывает свойство?

Комментарии:

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