-
Notifications
You must be signed in to change notification settings - Fork 9
拦截器
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属性禁用。