用慣了Laravel
的Ioc
,對象獲取變得那麼天然,初用Go
,各struct
,func
都要本身解析
一堆NewFunc
,索性本身搞了個ioc
參見Github(https://github.com/firmeve/firmeve)git
f := NewFirmeve()
f.Bind(`bool`, false)
f.Bind(`string`, "string")
Struct
綁定假設咱們有以下struct
github
type Foo struct { Bar string } func NewFoo(bar string) Foo{ return Foo{Bar:bar} }
咱們將foo
綁定進咱們的容器中函數
f.Bind(`foo`,NewFoo("abc"))
Prt
綁定綁定prt
的struct
類型是咱們最經常使用的一種方式,請看下面的示例\指針
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))
如今,讓咱們修改下上面的Person
string
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
不符合struct
的tag
規範,因此Firmeve
都會自動忽略。