如何在不同层中使用unity log4net扩展

时间:2018-11-16 11:24:36

标签: c# asp.net-web-api unity-container log4net

我在我的Web api项目中使用Unity.WwebAPI。它安装在我拥有控制器类的服务级别上。一切正常。

现在,我正在尝试在单独的日志记录项目中创建包装器类,以便可以在解决方案的不同层中使用unity log4net扩展。

如何在日志记录项目中注册unity log4net扩展?我知道如何在服务层的UnityConfig文件中执行此操作,但我想在日志记录项目中使用它,以便可以在不同的层访问我的日志消息方法

  

container.AddNewExtension ();

这是我的测试包装器类;

Unity Log4Net包装器类

 public class LogWrapper : ILogWrapper
{
    private readonly ILogWrapper _logWrapper;
    private ILog _log;

    public LogWrapper(ILogWrapper logWrapper)
    {
        _logWrapper = logWrapper;
    }

    public void LogMessage(string msg)
    {
        _log.Info(msg);
    }
}

1 个答案:

答案 0 :(得分:1)

具有自定义记录器

日志记录项目

public interface ILogger {
     void LogMessage(string msg);
}

为了不将您的代码耦合到第三方记录器,是一个好主意。

根项目

public class Log4NetWrapper : ILogger {
    private readonly ILog log; //log4net 

    public Log4NetWrapper(ILog log) {
        this.log = log;
    }

    public void LogMessage(string msg) {
        log.Info(msg);
    }

    //...
}

剩下的就是将您的自定义记录器以及第三方扩展名注册到合成根目录中的容器。

根项目(组成根)

container = new UnityContainer();

//...

container.AddNewExtension<Log4NetExtension>();

//...

container.RegisterType<ILogger, Log4NetWrapper>(new HierarchicalLifetimeManager());

并在不同层中需要的地方使用内部记录器。

public MyService(ILogger log) {
    //...
}

通过使用这种抽象,其他层不需要知道在幕后使用什么来进行日志记录。

只有composition root才需要知道第三方的依赖性,以便将其注册到IoC容器中。