[英]log4net custom appender dependency
我將實現一個log4net自定義追加程序。 我的Appender工作正常,但是在重構期間,我想隔離責任,因此我需要注入一個接口。 我寫了一些代碼,所以你可以理解
namespace WebServiceLogger.Interfaces
{
public interface IClientService
{
void SendLog(string logToSend);
}
}
這是我的Appender,現在通過郵件發送日志,但是明天我想使用相同的附加程序將日志發送到Web服務。
using log4net.Appender;
using log4net.Core;
using WebServiceLogger.Interfaces;
namespace WebServiceLogger
{
public class WebServiceLogAppender : AppenderSkeleton
{
private IClientService _clientService;
//Url property is declared with tag in my log4net.config tag
public string Url { get; set; }
public WebServiceLogAppender()
{
InitializeClientService();
}
protected override void Append(LoggingEvent loggingEvent)
{
var log = RenderLoggingEvent(loggingEvent);
_clientService.SendLog(log);
}
private void InitializeClientService()
{
var smtpClientFactory = new SmtpClientFactory();
var mailMessageFactory = new MailMessageFactory();
_clientService = new EmailClientService(smtpClientFactory,mailMessageFactory)
}
}
}
還有一個實現IClientService的類
using System.Net.Mail;
using WebServiceLogger.Interfaces;
namespace WebServiceLogger
{
public class EmailClientService : IClientService
{
private readonly SmtpClient _smtpClient;
private readonly IMailMessageFactory _mailMessageFactory;
public EmailClientService(ISmtpClientFactory smtpClientFactory, IMailMessageFactory mailMessageFactory)
{
_smtpClient = smtpClientFactory.Create("username", "password");
_mailMessageFactory = mailMessageFactory;
}
public void SendLog(string logToSend)
{
var message = _mailMessageFactory.CreateMailMessage(logToSend);
_smtpClient.Send(message);
}
}
}
我不想在此類中連接Web服務,但我只有一個無參數的構造函數。
答案是,我可以在log4net.config中指定實現IClientService接口的一個類的對象嗎?
由於log4net本身會創建附加程序,因此無法使用構造函數或屬性注入,並且無法在config中指定類:如果您確實只想在配置中指定實現IClientService
的類的名稱並創建,就可以在運行時使用它,但這並不是真正可取的。
如果您打算減少代碼重復,那么可以為您的自定義記錄器創建一個基類:您可以混合並匹配配置文件中的附加程序。
public abstract class BaseWebServiceLogAppender : AppenderSkeleton
{
protected IClientService _clientService;
//Url property is declared with tag in my log4net.config tag
public string Url { get; set; }
public BaseWebServiceLogAppender()
{
InitializeClientService();
}
protected override void Append(LoggingEvent loggingEvent)
{
var log = RenderLoggingEvent(loggingEvent);
_clientService.SendLog(log);
}
protected abstract void InitializeClientService();
}
public class EmailWebServiceLogAppender : BaseWebServiceLogAppender
{
protected override void InitializeClientService()
{
var smtpClientFactory = new SmtpClientFactory();
var mailMessageFactory = new MailMessageFactory();
_clientService = new EmailClientService(smtpClientFactory,mailMessageFactory)
}
}
public class SmsWebServiceLogAppender : BaseWebServiceLogAppender
{
protected override void InitializeClientService()
{
_clientService = new SmSClientService(…);
}
}
不確定您使用的是哪個容器。 就我而言,我正在使用Unity,並且能夠在創建容器后通過容器運行追加器實例:
ILog logger = LogManager.GetLogger("My Logger");
IAppender[] appenders = logger.Logger.Repository.GetAppenders();
foreach (IAppender appender in appenders)
{
container.BuildUp(appender.GetType(), appender);
}
container.RegisterInstance(logger);
BuildUp()
方法將在appender類中填充注入屬性:
public class LogDatabaseSaverAppender : AppenderSkeleton
{
[Dependency]
public IContextCreator ContextCreator { get; set; }
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.