在我的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

希望能有所帮助。

07-26 03:18