Skip to content

过滤器

从 5.1.0 版本后,我们引入了对订阅者过滤器的支持,以使在某些场景(如事务处理,日志记录等)中变得容易。

自定义过滤器

添加过滤器

创建一个过滤器类,并继承 SubscribeFilter 抽象类。

public class MyCapFilter: SubscribeFilter
{
    public override Task OnSubscribeExecutingAsync(ExecutingContext context)
    {
        // 订阅方法执行前
    }

    public override Task OnSubscribeExecutedAsync(ExecutedContext context)
    {
        // 订阅方法执行后
    }

    public override Task OnSubscribeExceptionAsync(ExceptionContext context)
    {
        // 订阅方法执行异常
    }
}

在一些场景中,如果想终止订阅者方法执行,可以在 OnSubscribeExecutingAsync 中抛出异常,并且在 OnSubscribeExceptionAsync 中选择忽略该异常。

通过在 ExceptionContext 中设置 context.ExceptionHandled = true 来忽略异常。

public override Task OnSubscribeExceptionAsync(ExceptionContext context)
{
    context.ExceptionHandled = true;
}

配置过滤器

services.AddCap(opt =>
{
    // ***
}.AddSubscribeFilter<MyCapFilter>();

目前, 我们还不支持同时添加多个过滤器。

过滤器中使用 AsyncLocal 的问题

我们不建议在过滤器中使用AsyncLocal,因为过滤器的生命周期为Scoped,所以直接定义临时变量即可在整个执行周期内共享变量值。 然后,如果由于一些你无法控制的原因要使用,由于AsyncLocal的设计问题,则可将异步过滤器作为同步使用,也就是继承的方法构造中不添加 async 关键字。