Skip to content

拦截器

Kakous edited this page Mar 22, 2019 · 6 revisions

Uragano里可以自定义拦截器,并且拦截器分服务器端拦截器和客户端拦截器

拦截器还分全局拦截器和局部拦截器,并且拦截器也是支持依赖注入的

创建拦截器

    public class ClientGlobalInterceptor : InterceptorAbstract
    {
        private ILogger Logger { get; }

        public ClientGlobalInterceptor(ILogger<ClientGlobalInterceptor> logger)
        {
            Logger = logger;
        }


        public override async Task<IServiceResult> Intercept(IInterceptorContext context)
        {
            Logger.LogTrace("\n---------------->Client global interceptor\n");
            return await context.Next();
        }
    }

还可通过自定义属性来注入拦截器,这里需要注意的是如果需要通过构造函数注入,必须声明一个无参的构造函数,因为这是自定义属性,这是必须的。

public class ClientInterceptorAttribute : InterceptorAttributeAbstract
    {
        private ILogger Logger { get; }

        public ClientInterceptorAttribute()
        {
        }

        public ClientInterceptorAttribute(ILogger<ClientInterceptorAttribute> logger)
        {
            Logger = logger;
        }
        public override async Task<IServiceResult> Intercept(IInterceptorContext context)
        {
            Logger.LogTrace("\n------------------>Server Interceptor attribute\n");
            var r = await context.Next();
            return r;
        }
    }

全局端拦截器

全局拦截器可通过AddClientGlobalInterceptor,AddServerGlobalInterceptor方法注入

services.AddUragano(Configuration, builder =>
             {
                 builder.AddConsul();
                 builder.AddClient();
                 builder.AddServer();
                 builder.AddClientGlobalInterceptor<ClientGlobalInterceptor>();
                 builder.AddServerGlobalInterceptor<ServerGlobalInterceptor>();
             });

局部拦截器

局部拦截器是通过自定义属性来注入,那自定义属性如何区分客户端和服务端呢?自定义属性加在服务接口上就是客户端拦截器,加在服务具体的实现类上就是服务器端拦截器。

[ServiceDiscoveryName("RPC")]
[ServiceRoute("hello")]
[ClientInterceptor]
public interface IHelloService : IService
{
    [ServiceRoute("say")]
    Task<ResultModel> SayHello(string name);
}

局部拦截器需要注意的是,考虑到在实际应用场景中,有可能在拦截器里需要访问数据库,所以拦截器注入都是采用Scoped生命周期管理,因此,局部拦截器里不支持自定义属性字段,因为注入的时候不会注入。

拦截器上下文

属性 描述
ServiceRoute 服务路由
Meta 元数据
Args 被拦截的服务参数
Next 执行下一个拦截器

禁用拦截器

如果有个别服务需要禁用拦截器,可以使用NonInterceptAttribute属性禁用。