2016年1月11日 星期一

Android 開發(110) dagger 實作概念

最近由於在研究架構方面的程式,所以又把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真的是很開心的一件事情
希望我也能夠有重新開始的時候啊(遠望..)

沒有留言:

張貼留言