2011-05-23 218 views

回答

0

从一个类似的问题,帮助没有this answer?它演示了如何在Unity 2中使用InjectionFactory来注册ILog。

+0

感谢您的建议,但我不”我认为它有帮助 – Karsten 2011-06-08 08:22:30

0

这可能不是最好的方法,但它是我能找到的唯一方法。所以现在它的:-)

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 arg0, object arg1, object arg2) 
    { 
     Log.DebugFormat(format, arg0, 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 arg0, object arg1) 
    { 
     Log.ErrorFormat(format, arg0, arg1); 
    } 

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

    public void ErrorFormat(IFormatProvider provider, string format, params object[] args) 
    { 
     Log.ErrorFormat(provider, format, 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 arg0, object arg1) 
    { 
     Log.FatalFormat(format, arg0, arg1); 
    } 

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

    public void FatalFormat(IFormatProvider provider, string format, params object[] args) 
    { 
     Log.FatalFormat(provider, format, 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 arg0, object arg1) 
    { 
     Log.InfoFormat(format, arg0, arg1); 
    } 

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

    public void InfoFormat(IFormatProvider provider, string format, params object[] args) 
    { 
     Log.InfoFormat(provider, format, 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 arg0, object arg1) 
    { 
     Log.WarnFormat(format, arg0, arg1); 
    } 

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

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

我知道这个答案是非常晚了,但我最近有这个问题。

现在有一个NuGet包,UnityLog4NetExtension,即注册log4net.ILog接口和一些统一建设策略,让您刚刚注入的ILog接口,并统一使用,它是在以注射类中创建它。

该代码也可通过GitHub获取。

例如:

扩展添加到统一的容器,你需要注入的ILog instancies之前。我已经在引导程序中完成了这项工作。

//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))