我有一个继承了简单日志记录界面的类。此接口的一个实现使用log4net。
Log4net有一个静态配置方法,在使用XML配置时需要调用该方法。该行是:
log4net.Config.XmlConfigurator.Configure();
文档通常声明将其置于全局事件中,但我希望将所有log4net代码封装到这一个类中。所以我只是使用静态变量来跟踪是否已经配置了log4net,如果没有,我会调用这个方法:
//This is static as I only ever want one instance
private static log4net.ILog _logger;
private static bool _isConfigured;
public Log4NetLogger() {
if(!_isConfigured) {
//This is needed to initialise the Log4Net logger
log4net.Config.XmlConfigurator.Configure();
_isConfigured = true;
_logger = log4net.LogManager.GetLogger(_defaultLogger);
}
}
问题是我不知道如何测试这个。我希望能够测试Configure()方法只被调用一次。静态变量和静态方法结合逻辑构成器的一部分使得这很棘手。
感觉这是我的代码很糟糕,有没有办法可以编写这段代码,以便配置调用只调用一次,然后,我该如何测试呢?
答案 0 :(得分:0)
您可以使用C#“Static Constructor”来实现您的目标。
//This is static as I only ever want one instance
private static log4net.ILog _logger;
static Log4NetLogger() {
//This is needed to initialise the Log4Net logger
log4net.Config.XmlConfigurator.Configure();
_logger = log4net.LogManager.GetLogger(_defaultLogger);
}
根据规范,它最多运行一次(每个App Domain),您不需要测试它。但是,您必须更仔细地处理异常,因为静态构造函数中的错误更难理解。