2008-10-29 5 views
10

Je suis relativement nouveau à Castle Windsor et j'examine les entrées et les sorties de l'installation d'exploitation forestière. Cela semble assez impressionnant, mais la seule chose que je ne peux pas faire est de savoir où Windsor place la propriété Logger sur mes classes. Comme dans le code suivant, Logger sera défini sur nullLogger si la classe n'a pas encore été configurée, mais lorsque Resolve est terminé, la propriété Logger est définie. Donc, ce que je me demande, c'est comment et où windsor règle ma propriété Logger.Où et comment Castle Windsor met en place une installation d'exploitation forestière

Vive Anthony

Répondre

12

L'enregistreur est configuré par l'installation de l'exploitation forestière, qui est dans la section <facilities> de la configuration. Par exemple, pour utiliser log4net votre application ou votre web.config ressemblerait à quelque chose comme ceci:

<?xml version="1.0"?> 
<configuration> 
    <configSections> 
     <section name="castle" type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor"/> 
    </configSections> 
<Configuration> 

<castle> 

    <facilities> 
     <facility id="loggingfacility" 
      type="Castle.Facilities.Logging.LoggingFacility, Castle.Facilities.Logging" 
      loggingApi="log4net" 
      configFile="logging.config" /> 
    </facilities> 

</castle> 
</configuration> 
1

Puisque vous avez une propriété publique avec un poseur, chaque fois que vous résoudre votre objet de Windsor, il essaiera également de mettre tout propriétés publiques avec des valeurs appropriées du conteneur (dans votre cas, un ILogger que votre installation va peupler dans Windsor). Cela signifie que si vous résolvez la classe à partir de Windsor, ce sera réglé. Mais pas si vous faites une nouvelle classe().

C'est au moins ce que je comprends.

L'autre approche consiste à utiliser des constructeurs, ce qui signifie si vous avez un constructeur nommé

Classe publique (enregistreur ILogger) il sera instancié avec ILogger comme paramètre.

Exemple:

 

var yourClassObject = Kernel.Resolve<IClass>(); 

Si vous ne disposez pas d'une spécification d'interface (et enregistrée en tant que telle), vous devrez enregistrer votre composant comme type concret si vous voulez résoudre en utilisant ce type de béton (et non par interface).

+0

Je voudrais voir un exemple de résolution de la classe du conteneur ici. – OutOFTouch

+0

Ajout d'un exemple simple. – jishi

+0

Merci, Cela confirme pour moi que j'ai compris ce que vous disiez. – OutOFTouch

11

Vous pouvez également configurer ce programatically lorsque vous initialisez windsor (par exemple à partir de votre Global.asax.cs):

container.AddFacility("logging", new LoggingFacility(LoggerImplementation.Log4net)); 

Vous pouvez bien sûr choisir l'un des enregistreurs implimentations.

Ceci sera câblé chaque fois que windsor instanciera n'importe quelle classe attendant un enregistreur. Je ne voudrais pas mettre cela dans le constructeur car c'est une préoccupation transversale - mieux vaut faire comme vous l'avez suggéré à mon avis. Vous pouvez le simplifier un peu:

private ILogger logger = NullLogger.Instance; 
    public ILogger Logger 
    { 
     get { return logger; } 
     set { logger = value; } 
    } 
+1

Le getter est redondant. La seule raison pour laquelle cette propriété existe est que Windsor peut remplacer l'enregistrement par défaut null. – IanT8

Questions connexes