命令拦截器
命令拦截器 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
类来实例化对象。