首页 > 数据库 >.Net6 + GraphQL + MongoDb全局状态

.Net6 + GraphQL + MongoDb全局状态

时间:2023-02-28 21:13:04浏览次数:52  
标签:string MongoDb userId requestBuilder GraphQL UserId Net6 public

介绍

文本说一下全局状态,这个东西还是比较有意思,他就像我们系统使用的时候业务中比如要拿 当前用户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

标签:string,MongoDb,userId,requestBuilder,GraphQL,UserId,Net6,public
From: https://www.cnblogs.com/MrChuJiu/p/17165972.html

相关文章