簡體   English   中英

溫莎城堡在哪里以及如何建立伐木設施

[英]Where & How Castle Windsor sets up logging facility

我對溫莎城堡很新,我正在研究伐木設施的進出口。 這似乎相當令人印象深刻,但我唯一無法解決的是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如何以及在哪里設置我的Logger屬性。

干杯安東尼

記錄器由記錄工具設置,該工具位於配置的<facilities>部分。 例如,使用log4net你的app或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>

初始化windsor時,您也可以以編程方式配置它(例如,從global.asax.cs):

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

您當然可以選擇任何記錄器實施方案。

只要windsor實例化任何期望記錄器的類,這將被連線。 我不會把它放在構造函數中,因為它是一個跨領域的問題 - 在我看來你做的更好。 您可以稍微簡化一下:

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

由於您有一個帶有Setter的公共屬性,因此每次從Windsor解析對象時,它還會嘗試使用容器中的適當值設置任何公共屬性(在您的情況下,您的工具將填充到Windsor中的ILogger)。

這意味着,如果您從Windsor解析Class,則會設置此值。 但是如果你做了新的Class()則不行。

這至少是我理解它的方式。

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

public class(ILogger logger)將使用ILogger作為參數進行實例化。

例:

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

如果您沒有接口規范(並且已注冊),則需要將組件注冊為具體類型(如果要使用該具體類型(而不是接口)解析它)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM