依赖管理功能是 为了解决 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