Autofac注入自定义Web-Api FilterAttribute

Str*_*los 5 asp.net-mvc inversion-of-control autofac asp.net-web-api

我有一个自定义ExceptionFilter,它记录Web-Api控制器中所有未捕获的异常.我想使用Autofac,为它注入ILog配置.

我的问题是怎么做?Autofac网站几乎没有解释如何这样做.

CustomFilter:

public class ApiControllerErrorFilterAttribute : ExceptionFilterAttribute
{
    private static readonly ILog log = LogManager.GetLogger("ApiLog");
    public override void OnException(HttpActionExecutedContext actionExecutedContext)
    {
        log.Error("Error: ", actionExecutedContext.Exception);
    }
}
Run Code Online (Sandbox Code Playgroud)

ps为了澄清,我还有一个普通控制器的自定义过滤器,我能够成功配置它.

过滤正常控制器:

public class ControllerErrorFilterAttribute : HandleErrorAttribute
{
    public ICustomLogSettings Log { get; set; }
    public override void OnException(ExceptionContext filterContext)
    {
        Log.GetLogger.Error("Error: ", filterContext.Exception);
    }
}
Run Code Online (Sandbox Code Playgroud)

日志配置:

    builder.Register(c => new BaseLog()).As<ICustomLogSettings>().InstancePerRequest();
    builder.RegisterFilterProvider();
Run Code Online (Sandbox Code Playgroud)

Jim*_*lla 5

其中一些示例可能有所帮助,尤其是:

builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration);

builder.Register(c => new MyWebApiFilter())
    .AsWebApiActionFilterFor<ValuesController>()
    .InstancePerApiRequest();
Run Code Online (Sandbox Code Playgroud)

从那以后,它告诉我你可以注册一个像其他任何服务一样得到解决的过滤器,这意味着你应该能够做到:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后能够像这样注册它:

builder.RegisterType<ApiControllerErrorFilterAttribute>()
    .AsWebApiActionFilterFor<ValuesController>()
    .InstancePerApiRequest();
Run Code Online (Sandbox Code Playgroud)

当然,你需要设置注册以解决ILog,这与wiki的这一部分非常相似.