我想配置Unity來將ILog注入到我的類中,其中LogManager.CreateLogger()中的類型/名稱被設置爲注入ILog的類。Log4net和Unity註冊
這裏是一個similar question,但對於構造圖
我想配置Unity來將ILog注入到我的類中,其中LogManager.CreateLogger()中的類型/名稱被設置爲注入ILog的類。Log4net和Unity註冊
這裏是一個similar question,但對於構造圖
從一個類似的問題,幫助沒有this answer?它演示瞭如何在Unity 2中使用InjectionFactory來註冊ILog。
這可能不是最好的方法,但它是我能找到的唯一方法。所以現在它的:-)
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);
}
}
我知道這個答案是非常晚了,但我最近有這個問題。
現在有一個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))
感謝您的建議,但我不」我認爲它有幫助 – Karsten 2011-06-08 08:22:30