在我的C#项目中,我使用log4net进行调试。但对于Release版本,我需要删除对log4net的任何依赖。我不确定什么是正确的方法。
#if DEBUG ... endif通过代码是非常混乱的,当我在Debug或Release模式下编译时,我必须手动添加/删除对log4net的引用。
我想到的另一个选择是以某种方式在Release版本中用模拟类切换“真正的”lotg4net,但我不知道该怎么做。
在我的情况下,在发布版本中删除依赖项log4net的最佳方法是什么?
答案 0 :(得分:3)
依赖注入是这里的最佳选择。通过在其间添加DI容器来抽象您的日志库远离您的物理实现(Logging是DI / IoC和AOP的候选子项之一)。将您的日志记录首选项卸载到可以为发布版本忽略的配置设置。你会为自己省去很多麻烦。
答案 1 :(得分:3)
按照M.Babcock的回答:你是依赖倒置的。您不一定 使用依赖注入容器,但您需要抽象日志记录。
这样的事情:
public interface ILog
{
void Trace(string message);
void Debug(string message);
void Error(string message);
// and whatever you need
}
然后你有不同的实现:
public class NullLog : ILog { ... } // does nothing --- all calls are empty
public class Log4NetLog : ILog { ... } // initializes Log4Net and does logging
然后,您可以使用静态类作为主要入口点:
public static class Log
{
private ILog log = new NullLogger();
public static void Assign(ILog log)
{
this.log = log;
}
public static void Debug(string message)
{
log.Debug(message);
}
// ...and other implementations...
}
现在您需要在启动代码中连接它。在这里,您可以使用容器或使用条件编译:
#if DEBUG
Log.Assign(new Log4NetLogger);
#endif
这些是广泛的。我有一些日志记录基础结构代码作为我的服务总线的一部分:http://shuttle.codeplex.com/
希望有所帮助。