在Dagger2中,一般都是使用@provide方法注入接口。
在我們使用MVP模式搭建Android app的時(shí)候,一般我們會(huì)這樣做,創(chuàng)建一個(gè)接口presenter命名為HomePresenter。
public interface HomePresenter {
Observable<List<User>> loadUsers()
}
然后創(chuàng)建一個(gè)這個(gè)接口的實(shí)例,叫做HomePresenterImp,
public interface HomePresenter {
Observable<List<User>> loadUsers();
}
public class HomePresenterImp implements HomePresenter {
public HomePresenterImp(){
}
@Override
public Observable<List<User>> loadUsers(){
//Return user list observable
}
}
但是請(qǐng)注意,在HomePresenterImp這個(gè)類中,我并沒有使用@Inject在構(gòu)造方法上。所以,我們要在module中我們經(jīng)常會(huì)使用一個(gè)叫provide的注解提供這個(gè)類的對(duì)象,就像這樣。
@Module
public class HomeModule {
@Provides
public HomePresenter providesHomePresenter(){
return new HomePresenterImp();
}
}
但是,如果我們需要添加一個(gè)依賴到presenter叫UserService,那就意味著,我們也要在module中添加一個(gè)provide方法提供這個(gè)UserService,然后在HomePresenterImp類中加入一個(gè)UserService參數(shù)的構(gòu)造方法;
或者
我們可以使用@Binds這個(gè)注解就想這樣:
@Module
public abstract class HomeModule {
@Binds
public abstract HomePresenter bindHomePresenter(HomePresenterImp homePresenterImp);
}
這個(gè)就是告訴dagger,這個(gè)HomePresenter是用的HomePresenterImp類實(shí)現(xiàn)的。當(dāng)然,你會(huì)注意到這個(gè)class是抽象類。這就意味著我們可以添加抽象方法。
那么現(xiàn)在。只要在HomePresenterImp類中的構(gòu)造方法加上@Inject注解,這樣,我們就不需要添加依賴參數(shù)來提供provide方法了。
我們只要簡(jiǎn)單的在構(gòu)造方法中使用@Inject;
@PerActivity
public class HomePresenterImp implements HomePresenter {
private UserService userService;
@Inject
public HomePresenterImp(UserService userService){
this.userService = userService;
}
@Override
public Observable<List<User>> loadUsers(){
return userService.getUsers();
}
}
如果你有提供實(shí)例類的方法只調(diào)用構(gòu)造函數(shù)注入接口。在dagger中使用@Binds注解可以代替原有的樣板模式。
英文好的就看英文吧,英文翻譯過來,有些地方還是有點(diǎn)不能很好的解釋清楚。
附上鏈接(需要翻墻):android.jlelse.eu/inject-interfaces-without-providing-in-dagger-2-618cce9b1e29
需要源碼的朋友我就提供一個(gè)patloew大神寫的MVVM模式中有用到@Binds的Demo,可以去對(duì)照運(yùn)行。還有不懂的可以在下面留言??梢韵嗷ソ涣?。
附上鏈接:GitHub - patloew/countries: An example Android app using Retrofit