В настоящее время я использую виндзорский замок, а также его средство регистрации в моем приложении.Перехват или украшение звонков в ILogger
Однако в моем протоколе я хотел бы включить некоторую контекстуальную информацию, которая не входит в зарегистрированное сообщение, но сохраняется в пределах CallContext
.
Я попытался сделать это путем перехвата вызовов ILogger
, используя следующие:
internal class Program
{
private static void Main(string[] args)
{
var container = new WindsorContainer();
container.AddFacility<LoggingFacility>(f => f.UseNLog());
container.Kernel.Resolver.AddSubResolver(new LoggerResolver(container.Kernel));
var logger = container.Resolve<ILogger>();
}
}
public class LoggerResolver: ISubDependencyResolver
{
private readonly IKernel _kernel;
private static ProxyGenerator _proxyGenerator;
static LoggerResolver()
{
_proxyGenerator = new ProxyGenerator();
}
public LoggerResolver(IKernel kernel)
{
_kernel = kernel;
}
public bool CanResolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency)
{
return dependency.TargetType == typeof(ILogger);
}
public object Resolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency)
{
return _proxyGenerator.CreateInterfaceProxyWithTarget(_kernel.Resolve<ILogger>(), new LoggingInterceptor());
}
}
public class LoggingInterceptor: IInterceptor
{
public void Intercept(IInvocation invocation)
{
//Some modification to message here
invocation.Proceed();
}
}
Но переменная logger
имеет тип NLog.Loggger
, а не динамический прокси я ожидал.
Спасибо - я в конечном итоге решить ее в очень похожим образом (я вверх по обновленного экземпляр 'NLogFactory' в реализации' ILoggerFactory') - но я предпочитаю свой метод. – Lawrence