Log4net和Unity寄存器

问题描述

| 我正在尝试配置Unity以将ILog注入到我的类中,其中LogManager.CreateLogger()中的类型/名称被设置为要注入ILog的类。 这是一个类似的问题,但对于结构图     

解决方法

我知道这个答案很晚,但是我最近遇到了这个问题。 现在有一个NuGet软件包UnityLog4NetExtension,用于注册
log4net.ILog
接口和一些Unity构建策略,该策略允许您仅注入
ILog
接口并让Unity使用要注入的类创建它。 该代码也可以通过GitHub获得。 例如: 在需要注入ILog实例之前,请将扩展添加到unity容器。我已经在引导程序中完成了此操作。
//add the extension to the unity container 
container.AddNewExtension<Log4NetExtension>();
然后,只需注入
ILog
接口即可
public class MyClass
{ 
    private readonly ILog _logger;

    public MyClass(ILog loggerForMyClass)
    {
        _logger = loggerForMyClass;
    }
}
这段代码就像我写了
_logger = LogManager.GetLogger(typeof(MyClass))
    ,这可能不是最好的方法,但这是我可以找到的唯一方法。因此,到目前为止,这是最好的方法:-)
Container.RegisterType<ILog>(new InjectionFactory(factory => new LoggerForInjection()));
--
public class LoggerForInjection : ILog
{
    private ILog _log;

    public bool IsDebugEnabled
    {
        get { return Log.IsDebugEnabled; }
    }

    public bool IsErrorEnabled
    {
        get { return Log.IsErrorEnabled; }
    }

    public bool IsFatalEnabled
    {
        get { return Log.IsFatalEnabled; }
    }

    public bool IsInfoEnabled
    {
        get { return Log.IsInfoEnabled; }
    }

    public bool IsWarnEnabled
    {
        get { return Log.IsWarnEnabled; }
    }

    public ILogger Logger
    {
        get { return _log.Logger; }
    }

    private ILog Log
    {
        get
        {
            if (_log == null)
            {
                // My tests shows,that is takes about 1 milli second to get the calling type
                var stackTrace = new StackTrace();
                string callingType = stackTrace.GetFrame(2).GetMethod().DeclaringType.FullName;

                _log = LogManager.GetLogger(callingType);
            }
            return _log;
        }
    }

    public void Debug(object message)
    {
        Log.Debug(message);
    }

    public void Debug(object message,Exception exception)
    {
        Log.Debug(message,exception);
    }

    public void DebugFormat(string format,params object[] args)
    {
        Log.DebugFormat(format,args);
    }

    public void DebugFormat(string format,object arg0)
    {
        Log.DebugFormat(format,arg0);
    }

    public void DebugFormat(string format,object arg0,object arg1)
    {
        Log.DebugFormat(format,arg0,arg1);
    }

    public void DebugFormat(string format,object arg1,object arg2)
    {
        Log.DebugFormat(format,arg1,arg2);
    }

    public void DebugFormat(IFormatProvider provider,string format,params object[] args)
    {
        Log.DebugFormat(provider,format,args);
    }

    public void Error(object message)
    {
        Log.Error(message);
    }

    public void Error(object message,Exception exception)
    {
        Log.Error(message,exception);
    }

    public void ErrorFormat(string format,params object[] args)
    {
        Log.ErrorFormat(format,args);
    }

    public void ErrorFormat(string format,object arg0)
    {
        Log.ErrorFormat(format,arg0);
    }

    public void ErrorFormat(string format,object arg1)
    {
        Log.ErrorFormat(format,arg1);
    }

    public void ErrorFormat(string format,object arg2)
    {
        Log.ErrorFormat(format,arg2);
    }

    public void ErrorFormat(IFormatProvider provider,params object[] args)
    {
        Log.ErrorFormat(provider,args);
    }

    public void Fatal(object message)
    {
        Log.Fatal(message);
    }

    public void Fatal(object message,Exception exception)
    {
        Log.Fatal(message,exception);
    }

    public void FatalFormat(string format,params object[] args)
    {
        Log.FatalFormat(format,args);
    }

    public void FatalFormat(string format,object arg0)
    {
        Log.FatalFormat(format,arg0);
    }

    public void FatalFormat(string format,object arg1)
    {
        Log.FatalFormat(format,arg1);
    }

    public void FatalFormat(string format,object arg2)
    {
        Log.FatalFormat(format,arg2);
    }

    public void FatalFormat(IFormatProvider provider,params object[] args)
    {
        Log.FatalFormat(provider,args);
    }

    public void Info(object message)
    {
        Log.Info(message);
    }

    public void Info(object message,Exception exception)
    {
        Log.Info(message,exception);
    }

    public void InfoFormat(string format,params object[] args)
    {
        Log.InfoFormat(format,args);
    }

    public void InfoFormat(string format,object arg0)
    {
        Log.InfoFormat(format,arg0);
    }

    public void InfoFormat(string format,object arg1)
    {
        Log.InfoFormat(format,arg1);
    }

    public void InfoFormat(string format,object arg2)
    {
        Log.InfoFormat(format,arg2);
    }

    public void InfoFormat(IFormatProvider provider,params object[] args)
    {
        Log.InfoFormat(provider,args);
    }

    public void Warn(object message)
    {
        Log.Warn(message);
    }

    public void Warn(object message,Exception exception)
    {
        Log.Warn(message,exception);
    }

    public void WarnFormat(string format,params object[] args)
    {
        Log.WarnFormat(format,args);
    }

    public void WarnFormat(string format,object arg0)
    {
        Log.WarnFormat(format,arg0);
    }

    public void WarnFormat(string format,object arg1)
    {
        Log.WarnFormat(format,arg1);
    }

    public void WarnFormat(string format,object arg2)
    {
        Log.WarnFormat(format,arg2);
    }

    public void WarnFormat(IFormatProvider provider,params object[] args)
    {
        Log.WarnFormat(provider,args);
    }
}