在 WebAPI 异常过滤器或 IExceptionLogger 中使用 EntityFramework 记录异常
Log Exceptions with EntityFramework in WebAPI Exception Filter or IExceptionLogger
我正在考虑在我的 Web API 2.x
应用程序中使用 ExceptionLogger
或 ExceptionFilterAttribute
。我的 OR/M 是 Entity Framework 6
,AutoFac
是我的 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
.
这是我 DbContext
的 AutoFac
配置:
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();
}
}
}
}
我正在考虑在我的 Web API 2.x
应用程序中使用 ExceptionLogger
或 ExceptionFilterAttribute
。我的 OR/M 是 Entity Framework 6
,AutoFac
是我的 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
.
这是我 DbContext
的 AutoFac
配置:
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();
}
}
}
}