我有一个自定义的 Web API ExceptionLogger,它像这样添加到 WebApiConfig 中:
config.Services.Add(typeof(IExceptionLogger), new CustomExceptionLogger(kernel.Get<ILoggerFactory>());
CustomExceptionLogger 是:
public class CustomExceptionLogger : ExceptionLogger
{
private readonly ILoggerFactory _logFactory;
public CustomExceptionLogger(ILoggerFactory log)
{
_logFactory = log;
}
public override void Log(ExceptionLoggerContext context)
{
var log = _logFactory.Create();
log.LogError("Unhandled exception: {0}",
context.Exception);
}
}
Ninject 绑定是:
Bind<ILogger>().ToMethod(CreateLogger)
.InRequestScope();
Bind<ILoggerFactory>().ToFactory();
我正在使用 Ninject.Extensions.Factory 扩展。ILoggerFactory 接口是:
public interface ILoggerFactory
{
ILogger Create();
}
当调用 Log() 时,我希望 ILoggerFactory 返回一个 ILogger 实例,该实例的范围为请求。但是,在这种情况下,我收到了一个新的 ILogger 实例,该实例与其他使用 ILoggerFactory 的其他实例不同。这似乎是由于HttpContext.Current
在null
Log() 方法中。尽管 ExceptionLoggerContext 对象包含一个 Request 对象(所以这个方法有一些请求上下文,而不是实际的 HttpContext)。
我正在使用 Web API 2.2/Ninject 3.2.2 的 IIS/Web 主机版本。
在这种情况下,如何让 InRequestScope() 正常工作?