asp.net-mvc - Autofac 注入(inject)自定义 Web-Api FilterAttribute

标签 asp.net-mvc asp.net-web-api inversion-of-control autofac

我有一个自定义的 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/

相关文章:

java - Spring 依赖注入(inject)与写入接口(interface)

c# - 使用 angular-ui-router 避免 .NET MVC Controller 调用

c# - MVC 4 后期绑定(bind) DataContext 实体 LINQ 引用

javascript - 允许小写的正则表达式

c# - 模型在 XML POST 上始终为 null

c# - 在 Redis Azure 中存储更大 (2MB) 的对象

c# - Web API OData (OData Client v4) key 中的正斜杠

c# - 在 MVC 4 网站上持续运行后台进程

c# - 使用 spring.net 创建字符串对象

c# - 如何将类型的泛型列表设置为其接口(interface)的泛型列表?