2

次のコンポーネントがあります

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 は、ファクトリ機能がメソッドを予期している場合のプロパティであるため、エラーが発生します。

ここに簡単な解決策はありますか?全体に間違った方法でアプローチしていますか?

編集:間違いなく解決策があります。以下の私の回答を参照してください。

4

2 に答える 2

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

そして出来上がり!

回答としてマークできないため、誰かがこれに投票してください。

于 2008-10-13T12:56:39.927 に答える
0

最も簡単な解決策は、プロパティをラップするメソッドを追加することではないでしょうか?

于 2008-10-10T22:07:02.237 に答える