.Net6 + GraphQL + MongoDb全局状态
介绍
文本说一下全局状态,这个东西还是比较有意思,他就像我们系统使用的时候业务中比如要拿 当前用户ID 、租户数据什么的。
正文
我们使用拦截器(Interceptor)来做一个Global State的例子说明
首先我们写一个拦截器,从认证信息中我们读取UserId并写入。
public class HttpRequestInterceptor : DefaultHttpRequestInterceptor
{
public override ValueTask OnCreateAsync(HttpContext context,
IRequestExecutor requestExecutor, IQueryRequestBuilder requestBuilder,
CancellationToken cancellationToken)
{
string userId =
context.User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
requestBuilder.SetProperty("UserId", userId);
// requestBuilder.SetProperty("IntegerValue", int.Parse(userId));
requestBuilder.SetProperty("ObjectValue", new User { Id = userId });
return base.OnCreateAsync(context, requestExecutor, requestBuilder,
cancellationToken);
}
}
当我们业务中需要用到UserId的时候只需要这样写
public class Query
{
public string Example1([GlobalState("UserId")] string userId)
{
// Omitted code for brevity
}
public string Example2([GlobalState("ObjectValue")] User user)
{
// Omitted code for brevity
}
}
我们也可以使用一种更优雅的写法
public class UserIdAttribute : GlobalStateAttribute
{
public UserIdAttribute() : base("UserId")
{
}
}
public class Query
{
public string Example([UserId] string userId)
{
// Omitted code for brevity
}
}
结语
本系列主要将GraphQL的使用,示例项目不能应用于生产,后续发一些GraphQL库出来讲解生产中的实际应用
联系作者:加群:867095512 @MrChuJiu