<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
習慣於Java或者C#開發的人應該對控制反轉與依賴注入應該再熟悉不過了。在Java平臺有鼎鼎大名的Spring框架,在C#平臺有Autofac,Unity,Windsor等,我當年C#開發時用的最多的就是Windsor。使用IoC容器是物件導向開發中非常方便的解耦模組之間的依賴的方法。各個模組之間不依賴於實現,而是依賴於介面,然後在建構函式或者屬性或者方法中注入特定的實現,方便了各個模組的拆分以及模組的獨立單元測試。
在[長安鏈]的設計中,各個模組可以靈活組裝,模組之間的依賴基於protocol中定義的介面,每個介面有一個或者多個官方實現,當然第三方也可以提供該介面更多的實現。為了實現更靈活的組裝各個模組,管理各個模組的依賴關係,於是我寫了iocgo這個輕量級的golang版Ioc容器。
現在go官方版本已經出到1.17了,當然我在程式碼中其實也沒有用什麼新版本的新特性,於是就用1.15版本或者之後的Go版本即可。要使用iocgo包,直接通過go get新增到專案中:
go get github.com/studyzy/iocgo
type Fooer interface { Foo(int) } type Foo struct { } func (Foo)Foo(i int) { fmt.Println("foo:",i) } type Barer interface { Bar(string) } type Bar struct { } func (Bar) Bar(s string){ fmt.Println("bar:",s) } type Foobarer interface { Say(int,string) } type Foobar struct { foo Fooer bar Barer } func NewFoobar(f Fooer,b Barer) Foobarer{ return &Foobar{ foo: f, bar: b, } } func (f Foobar)Say(i int ,s string) { f.foo.Foo(i) f.bar.Bar(s) } func TestContainer_SimpleRegister(t *testing.T) { container := NewContainer() container.Register(NewFoobar) container.Register(func() Fooer { return &Foo{} }) container.Register(func() Barer { return &Bar{} }) var fb Foobarer container.Resolve(&fb) fb.Say(123,"Hello World") }
這裡我使用NewContainer()建立了一個新的容器,然後在容器中呼叫Register方法註冊了3個介面和對應的建構函式,分別是:
接下來呼叫Resolve函數,並傳入var fb Foobarer 這個介面變數的指標,iocgo就會自動去構建Foobarer對應的範例,並最終將範例賦值到fb這個變數上,於是最後我們就可以正常呼叫fb.Say實體方法了。
iocgo的註冊interface到物件的函數定義如下:
func Register(constructor interface{}, options ...Option) error
iocgo為Register函數提供了以下引數選項可根據實際情況選擇性使用:
如果我們已經有了某個物件的範例,那麼可以將該範例和其想對映的interface直接註冊到ioc容器中,方便其他依賴的物件獲取,RegisterInstance函數定義如下:
RegisterInstance(interfacePtr interface{}, instance interface{}, options ...Option) error
使用上也很簡單,直接將範例對應的interface的指標作為引數1,範例本身作為引數2,傳入RegisterInstance即可:
b := &Bar{} var bar Barer //interface container.RegisterInstance(&bar, b) // register interface -> instance
相關對映我們通過Register函數和RegisterInstance函數已經註冊到容器中,接下來就需要從容器獲得指定的範例了。獲得範例需要呼叫函數:
func Resolve(abstraction interface{}, options ...ResolveOption) error
這裡第一個引數abstraction是我們想要獲取的某個interface的指標,第二個引數是可選引數,目前提供的選項有:
var fb Foobarer err:=container.Resolve(&fb)
另外如果我們的建構函式return的值中支援error,而且實際構造的時候確實返回了error,那麼Resolve函數也會返回對應的這個err。
特別注意:Resolve的第一個引數是申明的某個interface的指標,一定要是指標,不能直接傳interface
有些時候建構函式的入參非常多,於是我們可以申明一個結構體,把所有入參都放入這個結構體中,這樣建構函式就只需要一個引數了。iocgo也支援自動填充這個結構體中interface對應的範例,從而構造新的物件。另外iocgo也提供了Fill方法,可以直接填充某個結構體,比如:
type FoobarInput struct { foo Fooer bar Barer msg string } input := FoobarInput{ msg: "studyzy", } container.Register(func() Fooer { return &Foo{} }) container.Register(func() Barer { return &Bar{} }) err := container.Fill(&input)
結構體中的欄位還支援tag,目前提供的tag有兩種:
type FoobarInputWithTag struct { foo Fooer `optional:"true"` bar Barer `name:"baz"` msg string }
除了建構函式注入之外,iocgo也支援函數注入,我們申明一個函數,這個函數的引數中有些引數是interface,那麼通過呼叫iocgo中的Call方法,可以為這個函數注入對應的範例作為引數,並最終完成函數的呼叫。 範例 example:
func SayHi1(f Fooer, b Barer) { f.Foo(1234) b.Bar("hi") } Register(func() Fooer { return &Foo{} }) Register(func() Barer { return &Bar{} }) Call(SayHi1)
Call函數也是支援選項的,目前提供了2個選項:
在寫這個iocgo的程式碼時,主要參考了以下兩個Ioc相關的專案:
iocgo是一個純Golang語言開發的用於管理依賴注入的IoC容器,使用這個容器可以很好的實現go語言下的物件導向開發,模組解耦。現已經開源,歡迎大家使用,開源地址:https://github.com/studyzy/iocgo
以上就是Golang輕量級IoC容器安裝使用範例的詳細內容,更多關於Golang輕量級IoC容器的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45