Замок Виндзор: Как подключить компонент к заводскому свойству, а не к методу - PullRequest
2 голосов
/ 10 октября 2008

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

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

Где интервал времени должен быть предоставлен свойством ISettings.MyTimerFrequency.

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

    <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>         

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

Здесь есть простое разрешение? Я все неправильно подхожу к делу?

РЕДАКТИРОВАТЬ: Определенно есть решение, см. Мой ответ ниже.

Ответы [ 2 ]

4 голосов
/ 13 октября 2008

Решение на самом деле пришло ко мне во сне. Имейте в виду, что свойства - это не конструкция 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" />

И вуаля!

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

0 голосов
/ 11 октября 2008

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

...