2008-10-10 3 views
2

je le composant suivantWindsor Castle: Comment câbler un composant à une propriété d'usine plutôt que la méthode

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

Où timespan doit être fourni par la propriété ISettings.MyTimerFrequency.

Comment est-ce que je peux câbler ceci dans un conteneur xml? Je pensais que je pouvais faire quelque chose comme ceci:

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

mais j'obtiens une erreur car MyTimerFrequency est une propriété lorsque l'installation d'usine prévoit une méthode.

Y a-t-il une résolution simple ici? Est-ce que j'approche le tout de la mauvaise façon?

EDIT: Il y a certainement une solution, voir ma réponse ci-dessous.

Répondre

4

La solution m'est venue dans un rêve. Gardez à l'esprit que les propriétés ne sont pas une construction CLR mais plutôt du sucre syntaxique C#. Si vous ne me croyez pas essayer de compiler simplement

public class MyClass { 
    public object Item { 
    get; 
    } 
    public object get_Item() {return null;} 
} 

résultats dans une erreur: Type « TestApp.MyClass » se réserve déjà membre appelé « get_Item » avec les mêmes types de paramètres

Depuis le Xml la configuration est pinça lors de l'exécution après la compilation, nous pouvons simplement lier à une propriété factoryCreate en se liant à la méthode qu'il compile pour que l'exmple devient:

<component id="my_timer_frequency" 
         type="System.TimeSpan" 
         factoryId="settings" factoryCreate="get_MyTimerFrequency" /> 

Et le tour est joué! Quelqu'un vote ceci parce que je ne peux pas le marquer comme une réponse.

+0

Ou vous auriez pu vérifier les forums de château, où il a été répondu il ya quelque temps: http://forum.castleproject.org/viewtopic.php?t=4726 –

+1

Les propriétés sont en fait des constructions CLR. Le fait que le compilateur C# choisisse de nommer la méthode getter get_MyProperty est seulement un détail d'implémentation. Un autre compilateur pourrait choisir un schéma de nommage différent et la propriété existerait toujours et fonctionnerait. Vérifiez la spécification: http://msdn.microsoft.com/fr-fr/library/65zdfbdt%28VS.71%29.aspx –

0

La solution la plus simple ne serait-elle pas d'ajouter une méthode qui enveloppe la propriété?

+0

J'ai beaucoup de paramètres et l'idée de devoir envelopper chacun d'eux n'est pas très attrayante. –

Questions connexes