2008-10-29 8 views
10

Ich bin ziemlich neu in Castle Windsor und schaue in die Ein- und Ausgänge der Holzfällerei. Es scheint ziemlich beeindruckend, aber das einzige, was ich nicht herausfinden kann, ist, wo Windsor die Logger-Eigenschaft in meinen Klassen setzt. Wie im folgenden Code wird Logger auf den nullLogger gesetzt, wenn die Klasse noch nicht eingerichtet wurde, aber wenn Resolve beendet ist, wird die Logger-Eigenschaft gesetzt.Wo & Wie Castle Windsor Logging-Anlage eingerichtet

private ILogger logger; 

public ILogger Logger 
{ 
    get 
    { 
     if (logger == null) 
      logger = NullLogger.Instance; 
     return logger; 
    } 
    set { logger = value; } 
} 

Also was ich mich wundere ist, wie und wo windsor setzt meine Logger-Eigenschaft.

Prost Anthony

Antwort

12

Der Logger ist Setup durch die Protokollfunktion, die in dem <facilities> Abschnitt der Konfiguration ist.

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

Da Sie jedes Mal, wenn Sie eine öffentliche Eigenschaft mit einem Setter haben, lösen Sie Ihr Objekt von Windsor, wird es auch zu setzen versuchen, jede: Zum Beispiel Ihrer App oder web.config verwenden log4net in etwa so aussehen würden Öffentliche Eigenschaften mit entsprechenden Werten aus dem Container (in Ihrem Fall ein ILogger, den Ihre Einrichtung in Windsor füllt).

Bedeutung, wenn Sie die Klasse von Windsor lösen, wird dies festgelegt. Aber nicht, wenn du neue Klasse() machst.

Das ist zumindest, wie ich es verstehe.

Der andere Ansatz ist Konstrukteure zu verwenden, was bedeutet, wenn Sie einen Konstruktor genannt haben

public Class (ILogger Logger) wird es mit ILogger als Parameter instanziiert werden.

Beispiel:

 

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

Wenn Sie eine Schnittstellenspezifikation nicht (und als solche registriert), müssen Sie Ihre Komponente als konkreter registrieren, wenn Sie es, dass konkrete Art mit lösen wollen (und nicht nach Schnittstelle).

+0

Ich wünschte, ich könnte ein Beispiel für die Auflösung der Klasse aus dem Container hier sehen. – OutOFTouch

+0

Ein einfaches Beispiel hinzugefügt. – jishi

+0

Danke, Das bestätigt mir, dass ich verstanden habe, was du gesagt hast. – OutOFTouch

11

Sie können dies auch programmatisch konfigurieren, wenn Sie windsor (beispielsweise von Ihrem global.asax.cs) initialisieren:

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

Sie natürlich eine der Logger implimentations wählen können.

Dies wird verdrahtet, wenn windsor jede Klasse instanziiert, die einen Logger erwartet. Ich würde dies nicht in den Konstrukteur bringen, da es eine Querschnittsaufgabe ist - besser zu tun, wie Sie es meiner Meinung nach vorgeschlagen haben. Sie können es ein wenig vereinfachen:

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

Der Getter ist redundant. Der einzige Grund, warum diese Eigenschaft existiert, ist, dass Windsor den Standard-Nulllogger überschreiben kann. – IanT8

Verwandte Themen