Gone 发布 v2 beta版本,做了大量改进,……

90 阅读2分钟

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(): -100
    • gone.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)
}

生命周期

在这里插入图片描述

组件生命周期分为三个阶段:

  1. 初始化阶段

    • BeforeInit(): 依赖注入前调用
    • Init(): 依赖注入后调用
  2. 运行阶段

    • 实现Daemon接口的组件会调用Start()方法
  3. 停机阶段

    • 实现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()
}

完整文档