dotnetcore / Natasha

基于 Roslyn 的 C# 动态程序集构建库,该库允许开发者在运行时使用 C# 代码构建域 / 程序集 / 类 / 结构体 / 枚举 / 接口 / 方法等,使得程序在运行的时候可以增加新的模块及功能。Natasha 集成了域管理/插件管理,可以实现域隔离,域卸载,热拔插等功能。 该库遵循完整的编译流程,提供完整的错误提示, 可自动添加引用,完善的数据结构构建模板让开发者只专注于程序集脚本的编写,兼容 stanadard2.0 / netcoreapp3.0+, 跨平台,统一、简便的链式 API。 且我们会尽快修复您的问题及回复您的 issue.
https://natasha.dotnetcore.xyz/
MIT License
1.49k stars 220 forks source link

[Tasks]: 有关【新版 NMS.Github.SDK】相关功能的规划与任务细化 (意见搜集与讨论) #298

Open NMSAzulX opened 5 months ago

NMSAzulX commented 5 months ago

📃 计划清单 (Tasklist).

### 基于 .NET 版可靠的 GithubSDK
- [x] 1.  基于 Natasha 以及实例结构的 GraphQL 动态构建库.
- [x] 2.  可靠的可追溯的 Github 实体.
- [x] 3.  简单易用的,代码量尽可能少的 SDK API.
- [x] 4.  client 池化.
- [x] 5.  Query 相关功能.
- [x] 6.  Mutation 相关功能.
- [ ] 7.  高级 API 封装.
NMSAzulX commented 5 months ago
编号 相似度 ISSUE
1 73.03% [Tasks]: 有关【UT IS DEMO】相关功能的规划与任务细化 (意见搜集与讨论)
2 69.63% [Tasks]: 有关【动态方法模板】相关功能的规划与任务细化 (意见搜集与讨论)
3 69.63% [Tasks]: 有关【可视化管道配置】相关功能的规划与任务细化 (意见搜集与讨论)

该条自动推荐信息来自于 nms-bot.

NMSAzulX commented 5 months ago

低级 API 案例

Query

//创建查询实例
 GithubQueryData query = new()
{
    repository = new GithubRepository("DotNetCore","Natasha")
    {
        issue = new(297)
        {
            title = "",
            url = "",
            id=""
        }
    }
};
//获取查询结果
var (data, msg) = await query.GetExecuteResultAsync();
var issue = data!.repository!.issue!;

Mutation 不获取实体结果

//创建方法实例
GithubMutationData add = new()
{
    addReaction = new(issue.id!, GithubReactionContent.HOORAY)
};

//获取方法结果
(var result, msg) = await add.GetExecuteStateAsync();
if (result)
{
    Console.WriteLine("succeed");
}
else
{
    Console.WriteLine(msg);
}

Mutation 获取实体结果

GithubMutationData remove = new()
{
    removeReaction = new(issue.id!, GithubReactionContent.HOORAY)
    {
        //创建返回体实例
        reaction = new()
        {
            id = "",
            content = 0,
            createdAt = DateTime.Now
        }
    }
};

//获取方法结果
(var reData, msg) = await remove.GetExecuteResultAsync();
if (reData != null)
{
    var reaction = reData!.removeReaction!.reaction!;
    Console.WriteLine("succeed");
    Console.WriteLine(reaction.id);
    Console.WriteLine(reaction.content);
    Console.WriteLine(reaction.createdAt);
}
else
{
    Console.WriteLine(msg);
}
NMSAzulX commented 5 months ago

集合查询

GithubQueryData query = new()
{
    repository = new GithubRepository("DotNetCore", "Natasha")
    {
        //需要查询的集合
        labels = new GithubConnection<GithubLabel>()
        {
            nodes =
            [
                //创建一个元素:为了定义要查询返回的结构
                new GithubLabel()
                {
                    id = "",
                    name = "",
                }
            ]
        }
    }
};

//获取所有数据
var labels = await query.GetCollectionResultAsync(repository => repository!.labels!);

//获取最先的 5 个
var labels = await query.GetCollectionResultAsync(repository => repository!.labels!, 5);

//获取最后的 5 个
var labels = await query.GetCollectionResultAsync(repository => repository!.labels!, -5);

获取某集合总数

var count = await query.GetTotalAsync(repository => repository!.labels!);
Console.WriteLine(count);
NMSAzulX commented 5 months ago

分页查询

GithubQueryData query = new()
{
    repository = new GithubRepository("DotNetCore", "Natasha")
    {
        //需要查询的集合
        labels = new GithubConnection<GithubLabel>()
        {
            nodes =
            [
                //创建一个元素:为了定义要查询返回的结构
                new GithubLabel()
                {
                    id = "",
                    name = "",
                }
            ]
        }
    }
};

//从第一页取 5 条数据
var labels = await query.GetCollectionResultAsync(repository => repository!.labels!, 5);

//自动设置下一页游标
query.repository!.labels.SetNextPage();

//从下一页取 5 条数据
labels = await query.GetCollectionResultAsync(repository => repository!.labels!, 5);

//查询重置
query.repository.labels.Reset();

//从排尾取 5 条数据
labels = await query.GetCollectionResultAsync(repository => repository!.labels!, -5);

//自动设置排尾的前一页
query.repository!.labels.SetNextPage();

//从前一页取 5 条数据
labels = await query.GetCollectionResultAsync(repository => repository!.labels!, -5);