命令拦截器


  命令拦截器 DbCommandInterceptor 用于拦截 IDatabase 实例的方法,针对每个方法,分别提供 Before- 和 After- 的拦截方法。参数 DbCommandInterceptContext<T> 中的 T 即所拦截方法的返回类型。以下是一个使用拦截器实现数据缓存的示例:

public class MyDbCommandInterceptor : DbCommandInterceptor
{
    private readonly ICacheManager _cacheManager;
    
    public MyDbCommandInterceptor(ICacheManager cacheManager)
    {
        _cacheManager = cacheManager;
    }
    
    public override OnBeforeExecuteEnumerable<T>(DbCommandInterceptContext<IEnumerable<T>> context)
    {
        if (_cacheManager.Contains((string)context.QueryCommand))
        {
            context.Result = _cacheManager.Get<IEnumerable<T>>((string)context.QueryCommand);
            context.Skip = true;
        }
    }
    
    public override OnAfterExecuteEnumerable<T>(DbCommandInterceptContext<IEnumerable<T>> context)
    {
        _cacheManager.Add((string)context.QueryCommand, context.Result);
    }
}

  将 MyDbCommandInterceptor 配置到 IOC 容器中即可。


💡 特别提醒

  使用命令拦截器时,应使用 InterceptedDatabase 类而不是 Database 类来实例化对象。