package
0.0.0-20191223014748-c467e97456c9
Repository: https://github.com/seerx/goql.git
Documentation: pkg.go.dev

# README

自动注入及辅助能力

该例实现了参数自动注入功能,可以实现 Resolver 函数的参数或其承载结构中的成员变量自动注入。 只要合理使用注入功能,可以大量减少重复性开发工作,并降低错误出现率
所谓注入,还是需要自己实现注入函数,然后注册。注入的核心代码如下

func init() {
    g := goql.Get()
    g.RegisterInject(InjectClass) // 注册注入函数
}

// 要注入的对象
type ClassInfo struct {
    Grade string `json:"grade"` // 年级
    Class string `json:"class"` // 班级
}

// 注入函数
func InjectClass(ctx context.Context, r *http.Request, gp *graphql.ResolveParams) *ClassInfo {
    return &ClassInfo{
        Grade: "一年级",
        Class: "1 班",
    }
}

需要注意的是,注入函数必须是以下形式,返回的类型即为注入的类型,可以是指向结构的指针,也可以是一个 interface

func (ctx context.Context, r *http.Request, gp *graphql.ResolveParams) *YourType {

同一个类型只能注册一个注入函数。

注入到函数的参数中

func Inject(class *ClassInfo) (*ClassInfo, error) {
    // 此时 class 的值就等于 InjectClass 返回的值
	return class, nil
}
... ...
goql.Get().RegisterQuery(Inject)

验证

打开 GraphiQl 客户端,在查询编辑框中输入

{
  InjectToLoader {
    grade
    class
  }
}

点击执行,得到反馈

{
  "data": {
    "InjectToLoader": {
      "class": "1 班",
      "grade": "一年级"
    }
  }
}

同样,可以自行测试 Inject 方法

辅助功能

实现自动清理资源的功能,例如:自动关闭数据库连接
参见 inject_closer.go 代码
注入方式与普通注入一致,程序运行后, 打开 GraphiQl 客户端,在查询编辑框中输入

{
  ReadFromDB
}

可以再控制到看到输出

准备工作 建立数据库连接
使用数据库连接
清理工作 关闭数据库连接

当然,可做的事情,不仅仅是打开和关闭数据库连接,可以根据自己的场景去做一些实用的工作

# Functions

Inject 注入 ClassInfo 到参数 class.
注入函数.
ReadFromDB 测试自动关闭功能.

# Structs

要注入的对象.
DBConnection 运行后可以自动清理.
Loader resolver 函数承载结构.