【发布时间】:2014-05-13 14:44:06
【问题描述】:
不幸的是,当我使用 Log4Net 搜索涉及 Unity 或 IoC 的任何内容时,我已经搜索了很长时间,得到的唯一结果是如何通过 IoC 自动填充 ILog。这不是我想要做的。
我有一个自定义 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>(),它是在log4net 库中调用new WcfAppender()。如何让 log4net 库改用new WcfAppender(factoryGeneratedFromUnity)?
【问题讨论】:
标签: c# inversion-of-control log4net unity-container