golang Ioc

簡介

用慣了LaravelIoc,對象獲取變得那麼天然,初用Go,各struct,func都要本身解析
一堆NewFunc,索性本身搞了個ioc
參見Github(https://github.com/firmeve/firmeve)git

對象綁定

f := NewFirmeve()

標量綁定

f.Bind(`bool`, false)
f.Bind(`string`, "string")

Struct 綁定

假設咱們有以下structgithub

type Foo struct {
    Bar string 
}

func NewFoo(bar string) Foo{
    return Foo{Bar:bar}
}

咱們將foo綁定進咱們的容器中函數

f.Bind(`foo`,NewFoo("abc"))

Prt 綁定

綁定prtstruct類型是咱們最經常使用的一種方式,請看下面的示例\指針

type Baz struct {
    Baz string 
}

func NewBaz() *Baz {
   return &Baz{}
}

f.Bind(`baz`, NewBaz())

函數綁定

func NewFoo() Foo{
   return Foo{Bar:"default string"}
}

f.Bind(`foo`, NewFoo)
使用 Firmeve在綁定的時候暫時不支持參數注入
注意:若是是非函數類型綁定,則會默認爲單實例類型

已綁定值覆蓋

咱們經過WithBindCover(true)方法能夠輕鬆設定覆蓋參數code

f.Bind(`bool`, false)
fmt.Printf("%t",f.Get(`bool`))
f.Bind(`bool`, true, WithBindCover(true))
fmt.Printf("%t",f.Get(`bool`))

對象獲取

驗證對象是否存在

在不肯定容器中是否包含此對象時,請使用Has方法進行判斷對象

f.Has(`foo`)

對象獲取

直接獲取容器中的值blog

f.Get(`foo`)
注意:若是指的定的 key不存在,則會拋出 panic錯誤

新對象獲取

func NewFoo() Foo{
   return Foo{Bar:"default string"}
}

f.Bind(`foo`, NewFoo)
fmt.Printf("%p\n",f.Get("foo"))
fmt.Printf("%p\n",f.Get("foo"))
fmt.Printf("%p\n",f.Get("foo"))
Firmeve中,若是須要每次從新獲得一個新的結構體對象
必須綁定一個函數值,不然獲得的將是一個單實例

單例獲取

func NewFoo() Foo{
   return Foo{Bar:"default string"}
}

f.Bind(`foo`, NewFoo())
fmt.Printf("%p\n",f.Get("foo"))
fmt.Printf("%p\n",f.Get("foo"))
fmt.Printf("%p\n",f.Get("foo"))

參數解析

函數自動解析

讓咱們來看一個簡單的示例get

type PersonName struct {
   Name string
}

func NewPersonName() PersonName {
   return PersonName{Name: "Firmeve"}
}

type PersonAge struct {
   Age int
}

func PersonAge() *PersonAge {
   return &PersonAge{Age: 1}
}

type Person struct {
   name PersonName
   age *PersonAge
}

func NewPerson(name PersonName,age *PersonAge) *NewPerson {
    return NewPerson{
       name: name
       age: age
    }
}

f.Bind("PersonName", NewPersonName)
f.Bind("PersonAge", PersonAge)
fmt.Printf("%#v", f.Resolve(NewPerson))

結構體tag自動解析

如今,讓咱們修改下上面的Personstring

type Person struct {
   Name PersonName `inject:"PersonName"`
   Age *PersonAge `inject:"PersonAge"`
   age1 *PersonAge `inject:"PersonAge"`
}

而後咱們使用new函數直接建立一個新的結構體指針it

fmt.Printf("%#v", new(NewPerson))
注意:此時 Person中的 Name字段並非指針類型,而 age1不符合 structtag規範,因此 Firmeve都會自動忽略。

來源:https://blog.crcms.cn/2019/09...

相關文章
相關標籤/搜索