Castle Windsor:如何将组件连接到工厂属性而不是方法

时间:2008-10-10 15:32:05

标签: .net xml inversion-of-control castle-windsor

我有以下组件

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是一个属性。

这里有简单的解决方案吗?我是以错误的方式接近整个事情吗?

编辑:肯定有解决方案,请参阅下面的答案。

2 个答案:

答案 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)

最简单的解决方案是不是要添加一个包装属性的方法吗?