我有一个自定义的 ExceptionFilter,用于记录 Web-Api Controller 内所有未捕获的异常。我想使用 Autofac,向其注入(inject) ILog 配置。
我的问题是如何做到这一点? Autofac 网站几乎没有解释如何执行此操作。
自定义过滤器:
public class ApiControllerErrorFilterAttribute : ExceptionFilterAttribute
{
private static readonly ILog log = LogManager.GetLogger("ApiLog");
public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
log.Error("Error: ", actionExecutedContext.Exception);
}
}
附: 为了澄清起见,我还有一个用于普通 Controller 的自定义过滤器,并且我能够成功配置它。
普通 Controller 的过滤器:
public class ControllerErrorFilterAttribute : HandleErrorAttribute
{
public ICustomLogSettings Log { get; set; }
public override void OnException(ExceptionContext filterContext)
{
Log.GetLogger.Error("Error: ", filterContext.Exception);
}
}
日志配置:
builder.Register(c => new BaseLog()).As<ICustomLogSettings>().InstancePerRequest();
builder.RegisterFilterProvider();
最佳答案
一些these examples可能会有所帮助,尤其是:
builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration);
builder.Register(c => new MyWebApiFilter())
.AsWebApiActionFilterFor<ValuesController>()
.InstancePerApiRequest();
从中,它向我表明您可以注册一个像任何其他服务一样得到解析的过滤器,这意味着您应该能够执行以下操作:
public class ApiControllerErrorFilterAttribute : ExceptionFilterAttribute
{
private readonly ILog _log
public ApiControllerErrorFilterAttribute(ILog log)
{
_log = log;
}
public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
_log.Error("Error: ", actionExecutedContext.Exception);
}
}
然后就可以像这样注册它:
builder.RegisterType<ApiControllerErrorFilterAttribute>()
.AsWebApiActionFilterFor<ValuesController>()
.InstancePerApiRequest();
当然,你需要设置解析ILog的注册,这将与this part of the wiki非常相似。 .
关于asp.net-mvc - Autofac 注入(inject)自定义 Web-Api FilterAttribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25484150/