目前,我正通过DbInterception
将IDbCommandInterceptor
的实施内容添加到静态DbConfiguration
课程中:
public class LogDbConfiguration : DbConfiguration
{
public LogDbConfiguration()
{
if (AppConfig.LogDebugLevel > LogDebugLevel.Nothing)
{
DbInterception.Add(new PerformanceLogDbCommandInterceptor());
}
}
}
这个配置被添加到我想要挂钩的上下文中,作为属性:
[DbConfigurationType(typeof(LogDbConfiguration))]
public partial class MyEntityFrameworkDb // : DbContext
{
...
}
但是这会将IDbCommandInterceptor
挂钩到所有DbContexts,所以我必须检查我来自哪个上下文:
public class PerformanceLogDbCommandInterceptor : IDbCommandInterceptor
{
...
public void NonQueryExecuted(DbCommand command,
DbCommandInterceptionContext<int> interceptionContext)
{
LogIfMyEntityFrameworkDbContext(command, interceptionContext);
}
...
private void LogIfMyEntityFrameworkDbContext<T>(DbCommand command,
DbCommandInterceptionContext<T> interceptionContext)
{
...
//Log only to MyEntityFrameworkDb
if (!(interceptionContext.DbContexts.SingleOrDefault() is MyEntityFrameworkDb))
{
return;
}
...
}
}
我更愿意,如果我不必进行此类检查,并且只在特定上下文中将拦截器实现添加为观察者。我无法找到办法做到这一点。 MSDN's article on this说以下内容:
也可以使用基于DbConfiguration代码的配置机制在app-domain级别注册拦截器。
我不确定“app-domain level”是什么,但我认为这意味着与我目前所做的相同的范围/上下文。
有没有办法对Observer模式执行此操作 - 也就是说,将拦截器挂钩为特定类型的DbContext的侦听器?