我想在我的ExceptionLogger
申请中使用ExceptionFilterAttribute
或Web API 2.x
。我的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
1}}是AutoFac
所以我认为MyContext
会将DbContext
解析为共享AutoFac
。
以下是DbContext
的{{1}}配置:
builder.RegisterType<DbContext>()
.As<IDbContext>()
.InstancePerRequest();
如何让AutoFac
作为DbContext
的新实例重新加载ApiExceptionFilterAttribute
?
答案 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();
}
}
}
}