[英]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.