2008-10-29 67 views
10

我對溫莎城堡相當陌生,並且正在研究測井設施的進出情況。這似乎相當令人印象深刻,但唯一不能解決的是Windsor在我的課程中設置Logger屬性的地方。如下面的代碼將把Logger設置爲nullLogger,如果該類尚未設置,但是當Resolve運行完成時,Logger屬性被設置。城堡溫莎在哪裏和如何建立測井設施

private ILogger logger; 

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

所以我想知道的是如何和windsor設置我的記錄器屬性。

乾杯 安東尼

回答

12

記錄器是由測井設施,這是在配置的<facilities>部設置。例如使用log4net的應用程式或web.config中會是這個樣子:

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

因爲你有一個二傳手的公共屬性,每次從溫莎解決您的對象,它也將嘗試設置任何公共財產與適當的價值從容器(在你的情況下,你的設施將填入溫莎ILogger)。

意思是說,如果你從溫莎解決班級,這將被設置。但是,如果你做新的Class(),則不行。

這至少是我的理解。

另一種方法是使用構造函數,這意味着,如果你有一個名爲

公共類(ILogger記錄器)構造將與ILogger實例化作爲參數。

例子:

 

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

如果您還沒有一種接口規範(並註冊爲這樣的),你將需要註冊您的組件的具體類型,如果你想使用的具體類型來解決這個問題(而不是通過接口)。

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

當然你可以選擇任何記錄implimentations的:

+0

我希望我能看到一個從容器中解析類的例子。 – OutOFTouch 2012-11-10 20:49:11

+0

增加了一個簡單的例子。 – jishi 2012-11-12 09:47:41

11

您在初始化溫莎(例如您的global.asax.cs)也可以編程方式進行配置。

只要windsor實例化期望記錄器的任何類,它就會被連接起來。我不會把它放在構造函數中,因爲它是一個橫切關注點 - 更好地按照我的意見去做。你可以簡化一下:

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