我搜索了很长一段时间,不幸的是,当我搜索涉及Unity或IoC与Log4Net的任何事情时,我得到的唯一结果是如何使ILog
通过IoC自动填充。这是不是我正在尝试做什么。在自定义Log4Net appender中使用IoC
我有一个自定义Appender,通过WCF传输数据到服务器。我想要做的就是传递一个工厂方法,最好是由Unity生成的方法,它为我创建了WCF客户端类,这样我就可以在单元测试期间将实际客户端类替换为存根。问题是我无法找到关于如何将参数传递给自定义log4net appender的任何解释。
这是我通常会如何使用Unity实现这个。
public class WcfAppender : BufferingAppenderSkeleton
{
public WcfAppender(Func<ClientLoggerClient> loggerClientFactory) //How do I get this Func passed in?
{
LoggerClientFactory = loggerClientFactory;
}
private readonly Func<ClientLoggerClient> LoggerClientFactory;
private static readonly ILog Logger = LogManager.GetLogger(typeof(WcfAppender));
private static readonly string LoggerName = typeof(WcfAppender).FullName;
public override void ActivateOptions()
{
base.ActivateOptions();
this.Fix = FixFlags.All;
}
protected override bool FilterEvent(LoggingEvent loggingEvent)
{
if (loggingEvent.LoggerName.Equals(LoggerName))
return false;
else
return base.FilterEvent(loggingEvent);
}
protected override void SendBuffer(LoggingEvent[] events)
{
try
{
var client = LoggerClientFactory();
try
{
client.LogRecord(events.Select(CreateWrapper).ToArray());
}
finally
{
client.CloseConnection();
}
}
catch (Exception ex)
{
Logger.Error("Error sending error log to server", ex);
}
}
private ErrorMessageWrapper CreateWrapper(LoggingEvent arg)
{
var wrapper = new ErrorMessageWrapper();
//(Snip)
return wrapper;
}
}
但是我不叫container.Resolve<WcfAppender>()
这是在new WcfAppender()
被称为log4net的库。如何告诉log4net库使用new WcfAppender(factoryGeneratedFromUnity)
?
相反挂钩的在静态事件中,我使用log4net的'ILoggerRepository.Properties'系统来存储委托。详情请参阅我的回答。 –