我有以下组件
public class MyTimer : IMyTimer {
public MyTimer(TimeSpan timespan){...}
}
应该由ISettings.MyTimerFrequency属性提供时间跨度。
如何在windsor容器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是一个属性。
这里有简单的解决方案吗?我是以错误的方式接近整个事情吗?
编辑:肯定有解决方案,请参阅下面的答案。
答案 0 :(得分:4)
解决方案实际上是在梦中找到我的。请记住,属性不是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 :(得分:0)
最简单的解决方案是不是要添加一个包装属性的方法吗?