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

Log Exceptions with EntityFramework in WebAPI Exception Filter or IExceptionLogger

我正在考虑在我的 Web API 2.x 应用程序中使用 ExceptionLoggerExceptionFilterAttribute。我的 OR/M 是 Entity Framework 6AutoFac 是我的 IoC

考虑以下异常属性:

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 配置DbContextInstancePerRequest 所以我认为 AutoFac 会将 MyContext 解析为共享 DbContext.

这是我 DbContextAutoFac 配置:

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

如何让 AutoFac 重新爱上 DbContext 作为 ApiExceptionFilterAttribute 的新实例?

好吧,既然没人回答我的问题,我就说说大家是怎么解决这个问题的。要解决此问题,您只能使用 ServiceLocator 模式 (it's an anti-pattern.)。通过注入 AutoFac 的 life-time-scope 对象,您可以创建不同的作用域。

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();
           }
        }
    }
}