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

C# 如何在不同层中使用unity log4net扩展,c#,asp.net-web-api,unity-container,log4net,C#,Asp.net Web Api,Unity Container,Log4net,我正在web api项目中使用Unity.WwebAPI。它安装在我拥有控制器类的服务级别。一切正常 现在,我正试图在单独的日志项目中创建一个包装器类,这样我就可以在解决方案的不同层上使用UnityLog4Net扩展 如何在日志项目中注册unity log4net扩展?我知道如何在服务层的UnityConfig文件中实现这一点,但我希望在日志项目中实现这一点,以便可以在不同的层中访问我的日志消息方法 container.AddNewExtension() 这是我的测试包装器类 Unity Log

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

现在,我正试图在单独的日志项目中创建一个包装器类,这样我就可以在解决方案的不同层上使用UnityLog4Net扩展

如何在日志项目中注册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);
    }
}

拥有自定义记录器

伐木工程

因此,避免将代码与第三方记录器耦合是一个好主意

根项目

剩下的就是在composition根目录中注册自定义记录器以及容器的第三方扩展

根项目(组合根)

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


只有用户需要知道第三方依赖关系,才能将其注册到IoC容器。

为什么要注入logWrapper接口?它和LogWrapper不是同一个类吗?也许您需要注入ILog,而在需要使用logger(即服务/repos)的任何地方,ILogWrapper classLog4NetExtension都安装在不同的层中,我还需要在服务层的unity容器中注册吗?注册往往发生在合成根中。为此,我必须在我的服务项目中引用log4net。整个想法是有一个单独的日志类库,可以在任何其他项目中使用。从技术上讲,只有根项目需要了解第三方日志所以我需要在服务项目中安装扩展吗?
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) {
    //...
}