依赖管理功能是 为了解决 aurora 运行中组件与组件之间存在的依赖关系,编写代码中依赖初始化操作和业务层面完全隔离,
依赖加载专注把对应的组件存放到 Ioc 容器中。在服务运行期间,被容器管理的依赖会自动初始化并装配, aurora的Ioc
系统是服务于 aurora 也许并不适用于其他更复杂的功能,仅作为依赖装配。

组件

什么是组件? 在 aurora 中组件就是一个结构体变量,组件有唯一的id对应一个变量。组件主要分为2类,匿名组件和命名组件,前者并非没有名称,只是来源于注册方式不同采用的是结构体的全名来作为id。

加载组件

加载组件,就是把初始化好的变量,注册到 aurora 的内部容器中,在服务器启动期间,会初始化容器完成指定的依赖赋值,注册到容器中的组件,组件本身初始化号的属性不会被容器进行初始化。

方式一 : 命名注册

type Component map[string]interface{}
//通过 Use 方法注册 Component 
//注册了一个 id 为 xxx 的组件
a.Use(web.Component{"aaa":&{}})

方式二 : 匿名注册

//通过 Use 方法直接 指针类型的结构体
//注册了一个 id 为 Xxx 的组件
a.Use(new(Xxx))

方式三 : 构造器

type Constructor func() any
// NewEditor 构造器
func NewXxxx() web.Constructor {
    return func() interface{} {
        return new(Xxxx)
    }
}
// Server 全局加载
func (server *Server) Server() {
    server.Use(NewXxxx())
}

方式二和方式三的区别不大

使用组件

指针结构体组件

把组件注册到 aurora 的容器中,通过 golang tag 属性 ref:"" 来对容器中的依赖进行使用


// 通过命名方式注册了 3个组件
    a.Use(web.Component{
        "a": &Aaa{Name: "Aaa"},
        "b": &Bbb{Name: "Bbb"},
        "c": &Ccc{Name: "Caa"},
    })

type Aaa struct {
    Name  string
    DataB *Bbb `ref:"b"`
}

type Bbb struct {
    Name  string
    DataA *Aaa `ref:"a"`
}

type Ccc struct {
    Name string
}

示例中注册了3个命名组件分别是 a,b,c 。 a组件中的 DataB 属性通过 ref:"b" 引用了b组件,b组件的 DataA 也是一样的效果引用了b组件。


使用匿名注册组件,来自动初始化结构体控制器中的对应字段属性,能够达到和上面 ref tag 相同的效果

// 定义一个 组件
type Aaa struct {
    Name string
}

// 注册一个匿名组件
a.Use(&Aaa{Name: "Aaa"})

type TestServerA struct {
    TestA *Aaa  
}

type TestServerB struct {
    TestA *Aaa
}

// GetName 获取 组件id为a的Name属性
func (s *TestServerB) GetName() string {
    return s.TestA.Name
}

// GetUpdate 修改组件id为 a的Name属性
func (s *TestServerA) Update() {
    fmt.Println(s.TestA.Name)
    s.TestA.Name = "Bbb"
}

接口组件

接口组件提供了接口字段的初始化赋值,若组件内部有接口变量,容器初始化期间默认通过字段名从容器中查找依赖,默认查找方式未找到则跳过初始化。如果接口字段指定了 tag ref 属性,找不到对应的依赖变量则返回错误信息。

type A interface {
    Get() string
}

type Aaa struct {
    Name string
}

func (a *Aaa) Get() string {
    return a.Name
}

type Bbb struct {
    A
}
func main(){
    aaa := &serviceImp.Aaa{Name: "aaa"}
    bbb := &serviceImp.Bbb{}
    space := NewSpace()
    space.Put("A", aaa)
    space.Put("", bbb)
    err := space.Start()
    if err != nil {
        panic(err)
        return
    }
}
最后编辑: kuteng  文档更新时间: 2023-06-23 15:04   作者:kuteng