#.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. У меня много настроек, и идея о том, чтобы обернуть каждую из них, не очень привлекательна.