最近由於在研究架構方面的程式,所以又把dagger 的code拿出來讀了一遍,
今天就稍微解釋一下dagger幫我們省略掉的那些步驟吧!
首先,用過dagger的人都會看到類似這樣的code
getComponent().inject(this)
然後上方的 mainpresent就莫名的創建好了,所以立刻拿來用.
這麼神奇的code到底是怎麼做到的?
其實看完他的程式碼之後就會發現,他其實使用了ioc的原理,
將MainActivity 塞到 創建出來的code之後直接access field
從code flow來看,當上面的程式碼call inject之後就會call 到
mainActivityMembersInjector.injectMembers();
而mainActivityMembersInjector 是誰?
可以稍微往上看一下
你可以想像 mainActivityMembersInjector可以取得所有MainActivity需要被注入的class
例如presenter
DaggerMainComponent.java
從下面這張圖就可以看出,
instance.mainPrsenter = mainPrsenterProvider.get(); 就是將 presenter init的地方
所以當MainActivity call 了 inject 之後
presenter就被init了
MainActivity_MembersInjector.java
到這邊,其實我對於中間那層ioc(DaggerMainComponent)有點疑問,如果只是要mock presenter
其實不需要中間這層(DaggerMainComponent),我只需要將presenterProvider mock掉就行了
也就是
架構也可以換成在DaggerMainComponent直接改成
public void inject(){
presenter = MockPresenterProvider.getPresenter();
}
然後provider換成mock的provider就行了.
目前要mock的方法,看起來都必須使用flavor 然後實作相同的回傳值,
個人覺得看似很方便,但是當refactor or rename的時候很危險,除非有用interface 限制住,否則很容易會造成code 無法build 過...
最近一直在思考,到底要不要將舊project翻過一輪...
有很多好處,但是翻過一輪也很痛苦啊!!
想用dagger又覺得這樣改似乎有點可怕,哈哈
希望大家不要遇到跟我一樣的情況,能重新開始一個project真的是很開心的一件事情
希望我也能夠有重新開始的時候啊(遠望..)
沒有留言:
張貼留言