使用WebAPI异常过滤器或IExceptionLogger中的EntityFramework记录异常

时间:2018-02-02 13:53:11

标签: entity-framework asp.net-web-api asp.net-web-api2 autofac

我想在我的ExceptionLogger申请中使用ExceptionFilterAttributeWeb API 2.x。我的OR / M为Entity Framework 6AutoFacIoC

考虑以下异常属性:

public class ApiExceptionFilterAttribute : ExceptionFilterAttribute
{

    public IDbContext MyContext { get; set; }

    public override void OnException(HttpActionExecutedContext actionExecutedContext)
    {
        base.OnException(actionExecutedContext);

        // some code

        MyContext.SaveChanges();
    }
}

我认为,如果我的应用程序抛出任何异常OnException方法将被调用,我需要一个新的DbContext实例来保存错误日志,但AutoFac DbContext配置InstancePerRequest 1}}是AutoFac所以我认为MyContext会将DbContext解析为共享AutoFac

以下是DbContext的{​​{1}}配置:

builder.RegisterType<DbContext>()
       .As<IDbContext>()
       .InstancePerRequest();

如何让AutoFac作为DbContext的新实例重新加载ApiExceptionFilterAttribute

1 个答案:

答案 0 :(得分:0)

好吧,由于没有人回答我的问题,所以我谈论了每个人如何解决这个问题的方法。要解决此问题,您只能使用ServiceLocator模式(it's an anti-pattern.)。通过注入AutoFac的生命周期对象,您可以创建不同的作用域。

public class ApiExceptionFilterAttribute : ExceptionFilterAttribute
{

    // public IDbContext MyContext { get; set; }
    public readonly ILifetimeScope LifeTimeScpoe{ get; set; }

    public override void OnException(HttpActionExecutedContext actionExecutedContext)
    {
        base.OnException(actionExecutedContext);

        // some code
        using(var scope = LifeTimeScope.BeginLifeTimeScope("ExceptionLogging"))
        {
           using(var dbContext = scope.Resolve<>(IDbContext))
           {
              // do some log logic
              dbContext.SaveChanges();
           }
        }
    }
}