如何在Release版本中删除对log4net的依赖?

时间:2012-02-11 04:23:41

标签: c# .net

在我的C#项目中,我使用log4net进行调试。但对于Release版本,我需要删除对log4net的任何依赖。我不确定什么是正确的方法。

#if DEBUG ... endif通过代码是非常混乱的,当我在Debug或Release模式下编译时,我必须手动添加/删除对log4net的引用。

我想到的另一个选择是以某种方式在Release版本中用模拟类切换“真正的”lotg4net,但我不知道该怎么做。

在我的情况下,在发布版本中删除依赖项log4net的最佳方法是什么?

2 个答案:

答案 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/

的ILog: http://shuttle.codeplex.com/SourceControl/changeset/view/c49f328edd17#Shuttle.Core%2fsource%2fShuttle.Core.Infrastructure%2fLogging%2fILog.cs

NullLog: 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

希望有所帮助。