在我的C#项目中,我使用log4net进行调试。但是对于Release版本,我需要删除对log4net的任何依赖。我不确定执行此操作的正确方法是什么。
在代码中使用#if DEBUG ... endif非常混乱,在调试或发布模式下进行编译时,必须手动将引用添加到log4net或从中删除。
我考虑过的另一个选择是通过Release版本中的模拟类以某种方式切换“真实的” lotg4net,但是我不确定如何执行此操作。
在Release版本中,删除依赖项的最佳方法是什么?
最佳答案
遵循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/
ILog:
http://shuttle.codeplex.com/SourceControl/changeset/view/c49f328edd17#Shuttle.Core%2fsource%2fShuttle.Core.Infrastructure%2fLogging%2fILog.cs
空日志:
http://shuttle.codeplex.com/SourceControl/changeset/view/c49f328edd17#Shuttle.Core%2fsource%2fShuttle.Core.Infrastructure%2fLogging%2fNullLog.cs
Log4NetLog:
http://shuttle.codeplex.com/SourceControl/changeset/view/c49f328edd17#Shuttle.Core%2fsource%2fShuttle.Core.Infrastructure.Log4Net%2fLog4NetLog.cs
希望能有所帮助。