Gone@v2 使用说明
Goner的定义
Goner是Gone框架的基本组件单元,只需嵌入gone.Flag即可。例如:
package demo
import "github.com/gone-io/gone"
type Component struct {
gone.Flag
}
组件加载
Gone框架提供了多种灵活的组件加载方式:
// 基础加载
gone.Load(&Component{})
// 命名加载
gone.Load(&Component{}, gone.Name("myComponent"))
// 链式加载
gone.Load(&Component1{}).
Load(&Component2{})
// 批量加载
gone.Loads(func(loader gone.Loader) error {
if err := loader.Load(&Component1{}); err != nil {
return err
}
return loader.Load(&Component2{})
})
加载选项
框架支持以下加载选项:
gone.IsDefault(): 将组件标记为默认实现gone.Order(n): 设置启动顺序,提供三个预设值:gone.HighStartPriority(): -100gone.MediumStartPriority(): 0 (默认)gone.LowStartPriority(): 100
gone.Name(name): 设置组件名称gone.OnlyForName(): 仅允许按名称注入gone.ForceReplace(): 允许替换现有组件gone.LazyFill(): 延迟加载组件
依赖注入
类型注入
type Service struct {
gone.Flag
dep *Dependency `gone:"*"` // 按类型注入
}
命名注入
type Service struct {
gone.Flag
dep *Dependency `gone:"myDep"` // 按名称注入
}
Provider注入
Gone v2引入了强大的Provider机制,支持多种Provider类型:
// 泛型Provider
type Provider[T any] interface {
Goner
Provide(tagConf string) (T, error)
}
// 无参Provider
type NoneParamProvider[T any] interface {
Goner
Provide() T
}
// 命名Provider
type NamedProvider interface {
NamedGoner
Provide(tagConf string, t reflect.Type) (any, error)
}
生命周期
组件生命周期分为三个阶段:
-
初始化阶段
BeforeInit(): 依赖注入前调用Init(): 依赖注入后调用
-
运行阶段
- 实现
Daemon接口的组件会调用Start()方法
- 实现
-
停机阶段
- 实现
Daemon接口的组件会调用Stop()方法
- 实现
Hook函数
框架提供四个钩子点:
- BeforeStart
- AfterStart
- BeforeStop
- AfterStop
gone.Load(&Component{}).
BeforeStart(func() {
// 启动前执行
}).
AfterStart(func() {
// 启动后执行
}).
Run()
高级特性
多实例支持
使用gone.Prepare()创建独立的Gone实例:
instance := gone.Prepare()
instance.Load(&Component{}).Run()
动态获取组件
通过GonerKeeper接口动态获取组件:
type Service struct {
gone.Flag
keeper gone.GonerKeeper `gone:"*"`
}
func (s *Service) GetComponent() {
comp := s.keeper.GetGonerByName("myComponent")
}
数组注入
支持注入同类型的多个组件:
type Service struct {
gone.Flag
workers []Worker `gone:"*"` // 注入所有Worker实现
}
函数参数注入
支持自动注入函数参数:
type Service struct {
gone.Flag
injector gone.FuncInjector `gone:"*"`
}
func (s *Service) Execute() {
fn := func(dep *Dependency) {
// dep会被自动注入
}
wrapped, _ := s.injector.InjectWrapFunc(fn, nil, nil)
wrapped()
}