Использование IoC в настраиваемом приложении Log4Net
К сожалению, я довольно долго искал, когда искал что-либо, связанное с Unity или IoC, с помощью Log4Net, единственные результаты, которые я получал, - это как сделатьILog
автоматически заполняется через IoC. Этоне что я пытаюсь сделать
У меня есть пользовательский Appender, который передает данные через WCF на сервер. Я хотел бы передать фабричный метод, предпочтительно сгенерированный Unity, который создает для меня клиентский класс WCF, чтобы я мог поменять реальный клиентский класс на заглушки во время модульного тестирования. Проблема в том, что я нигде не могу найти объяснения о том, как передать аргумент настраиваемому приложению log4net.
Вот как я обычно реализую это, используя 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>()
именно в библиотеке log4netnew WcfAppender()
вызывается. Как мне указать библиотеку log4net использоватьnew WcfAppender(factoryGeneratedFromUnity)
вместо?