Gone框架介绍10 - Gone的核心概念

gone是可以高效开发Web服务的Golang依赖注入框架
github地址:https://github.com/gone-io/gone
文档地址:https://goner.fun/
请帮忙在github上点个 ⭐️吧,这对我很重要 ;万分感谢!!

该文档的原地址为:https://goner.fun/zh/guide/core-concept.html
有任何问题,可以直接参考源文档或者到github提交issue。

Gone的核心概念

“我们编写的代码,终究只是死物,除非他在天国复活,为此我们需要将他埋葬墓园。”

Goner(逝者)

在Gone框架中,最基本的和最核心的概念就是 Goner,Goner 是指的匿名嵌入了 gone.Flag 的结构体。举个例子:

type Worker struct {
	gone.Flag
}

Goner是Gone框架中的组件,是实现依赖注入的关键:

  1. Goner可以作为属性被注入到其他结构体
  2. Goner的属性可以被其他类型注入

为什么需要内嵌一个 gone.Flag?是因为我们希望限制依赖注入的范围,让依赖注入只发生在Goners之间,让Gone框架的组件实现有一个统一的模式。

下面是Goner和gone.Flag的源代码:

type Flag struct{}

func (g *Flag) goneFlag() {}

//...

// Goner 逝者
type Goner interface {
	goneFlag()
}

Goner作为接口,要求实现它的“对象”拥有一个私有的方法goneFlag();由于go语言可见性的限制,不能在github.com/gone-io/gone以外的包中实现其内部定义的私有方法;一个结构体要成为Goner,只能通过内嵌gone.Flag才能“继承”私有的方法goneFlag()。这段话可能有些不好理解,其实就是说Goner的实现只能通过内嵌gone.Flag来完成,不能通过实现goneFlag()方法来完成。

多个Goner,我们使用其复数形式(Goners)表示。

在Gone框架中,还包含了三类特殊的Goner,定义如下:

🔮Prophet(先知)

一种特殊的 Goner,在普通 Goner 上实现了 AfterRevive() AfterReviveError 方法就是 Prophet(先知)AfterRevive 会在 Goner 被复活后被执行。

Prophet接口定义如下:

// Prophet  先知
type Prophet interface {
	Goner
	//AfterRevive 在Goner复活后会被执行
	AfterRevive() AfterReviveError
}

😇Angel(天使)

一种特殊的 Goner,拥有天使左翼Start(Cemetery) error 和 天使右翼Stop(Cemetery) error,左翼负责生(用于分配资源,启动某项服务),右翼负责死(用于终止某项服务,回收资源)。

Angel接口定义如下:

type Angel interface {
	Goner
	Start(Cemetery) error
	Stop(Cemetery) error
}

🧛🏻‍♀️Vampire(吸血鬼)

一种特殊的 Goner,拥有特殊能力——吸血Suck(conf string, v reflect.Value) SuckErrorSuck可以将不是Goner的值赋予注入给Goner属性。

Vampire接口定义如下:

type SuckError error
type Vampire interface {
	Goner
	Suck(conf string, v reflect.Value) SuckError
}

Cemetery(墓园)

Cemetery用于管理Goners,主要提供Bury(埋葬)和 revive(复活)的方法,其接口定义如下:

type Cemetery interface {
	// ... 其他方法
	Goner
	Bury(Goner, ...GonerId) Cemetery  // 埋葬,将逝者埋葬到墓园



	//ReviveAllFromTombs 复活所有Goner
	ReviveAllFromTombs() error

	//...
}

从代码上可以看到Cemetery本身也是一个Goner,在Gone框架启动时他会被自动埋葬和复活。

Bury(埋葬)

将Goner 埋葬Cemetery 就是将Goner注册到框架,以待后续完成属性的注入;在代码实现上,BuryCemetery上的公开方法,一般在通过 Priest 函数调用该方法。

Revive(复活)

Revive(复活)指的是Goner所有需要注入的属性完成注入的过程。在函数ReviveAllFromTombs() error中,所有被埋葬Cemetery的Goners都会被尝试复活,如果有属性不能正常注入,程序将panic。

ReviveAllFromTombs在完成了复活所有的Goners后,会调用所有ProphetAfterRevive方法。

Heaven(天国)

Heaven(天国)代表了一个Gone程序,用于管理程序的启动、停止等状态和流程(复活在启动前完成),用于在启动前后以及程序停止前执行一些hook任务。Heaven接收一个牧师函数开始运行,例如:

package main

import "github.com/gone-io/gone"

func Priest(cemetery gone.Cemetery) error {
	// 调用 cemetery.Bury 埋葬 Goner
	// 或者 调用其他 Priest 函数
	// TODO
	return nil
}

func main(){
	gone.Run(Priest)
}

或者:

package main

import "github.com/gone-io/gone"

func Priest(cemetery gone.Cemetery) error {
	// 调用 cemetery.Bury 埋葬 Goner
	// 或者 调用其他 Priest 函数
	// TODO
	return nil
}

func main(){
	gone.
		Prepare(Priest).
		AfterStart(func(){
			//TODO: 启动后执行一些操作
		}).
		Run()
}

Priest (牧师)

Priest (牧师)是负责将Goner埋葬到Cemetery的函数,他的定义如下:

type Priest func(cemetery Cemetery) error

Priest函数实现上,可以调用 cemetery.Bury 来完成,如下:

type Worker struct {
	gone.Flag
	Name string
}

type Boss struct {
	gone.Flag

	Name string
}

func aPriest(cemetery gone.Cemetery) error {
	cemetery.Bury(&Boss{Name: "Jim"}, "boss-jim")
	cemetery.Bury(&Worker{Name: "Bob"}, "worker-bob")

	//匿名埋葬,不指定被埋葬Goner的GonerId
	cemetery.Bury(&Worker{Name: "X"})
	return nil
}
//...

也可以通过调用其他的Priest函数来完成:

func a1Priest(cemetery gone.Cemetery) error {

	//todo
	return nil
}

func a2Priest(cemetery gone.Cemetery) error {

	//todo
	return nil
}

func aPriest(cemetery gone.Cemetery) error {
	_ = a1Priest(cemetery)
	_ = a2Priest(cemetery)

	//todo
	return nil
}

如果我们开发了一个组件包,其中使用了多个Goners来完成响应的功能,使用时需要同时埋葬这些Goners,那么我们可以编写一个Priest函数方便业务代码批量埋葬这些Goners

框架内置的组件包,我们就是这样干的,代码文档

另外,我们开发了一个命令行辅助工具gone,用于扫描特殊注释//go:gone自动生成牧师函数,参考自动生成Priest

求赞助

如果觉得还可以,请帮忙在github上点个 ⭐️吧:
github地址:https://github.com/gone-io/gone

福利🔥添加交流群,赠送 Golang 多套 学习资料,夯实基础👍🏻👍🏻

上一篇:Gone框架介绍9 - 如何优雅使用内置Goners?
下一篇:Gone框架介绍11 - 通过内置Goners支持配置文件

  • 29
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dapeng-大鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值