【问题标题】:Log Exceptions with EntityFramework in WebAPI Exception Filter or IExceptionLogger在 WebAPI 异常过滤器或 IExceptionLogger 中使用 EntityFramework 记录异常
【发布时间】:2018-02-02 13:53:11
【问题描述】:

我正在考虑在我的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 DbContext 配置是 InstancePerRequest 所以我认为AutoFac 会将MyContext 解析为共享DbContext

这是我对DbContextAutoFac 配置:

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

我怎样才能让AutoFac 重新爱上DbContext 作为ApiExceptionFilterAttribute 的新实例?

【问题讨论】:

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


    【解决方案1】:

    好的,由于没有人回答我的问题,我稍微谈谈每个人如何解决这个问题。要解决此问题,您只能使用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();
               }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-04
      • 2011-05-15
      相关资源
      最近更新 更多