关于Dagger2中@Binds的使用

作者: 王者梦回Arvin | 来源:发表于2016-09-23 15:09 被阅读2905次

在Dagger2中,一般都是使用@provide方法注入接口。
在我们使用MVP模式搭建Android app的时候,一般我们会这样做,创建一个接口presenter命名为HomePresenter。

public interface HomePresenter {
   Observable<List<User>> loadUsers()
}

然后创建一个这个接口的实例,叫做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
  }
}

但是请注意,在HomePresenterImp这个类中,我并没有使用@Inject在构造方法上。所以,我们要在module中我们经常会使用一个叫provide的注解提供这个类的对象,就像这样。

@Module
public class HomeModule {

  @Provides
  public HomePresenter providesHomePresenter(){
    return new HomePresenterImp();
  }
}

但是,如果我们需要添加一个依赖到presenter叫UserService,那就意味着,我们也要在module中添加一个provide方法提供这个UserService,然后在HomePresenterImp类中加入一个UserService参数的构造方法;
或者
我们可以使用@Binds这个注解就想这样:

@Module
public abstract class HomeModule {

  @Binds
  public abstract HomePresenter bindHomePresenter(HomePresenterImp homePresenterImp);
}

这个就是告诉dagger,这个HomePresenter是用的HomePresenterImp类实现的。当然,你会注意到这个class是抽象类。这就意味着我们可以添加抽象方法。
那么现在。只要在HomePresenterImp类中的构造方法加上@Inject注解,这样,我们就不需要添加依赖参数来提供provide方法了。
我们只要简单的在构造方法中使用@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();
  }
}

如果你有提供实例类的方法只调用构造函数注入接口。在dagger中使用@Binds注解可以代替原有的样板模式。
英文好的就看英文吧,英文翻译过来,有些地方还是有点不能很好的解释清楚。
附上链接(需要翻墙):android.jlelse.eu/inject-interfaces-without-providing-in-dagger-2-618cce9b1e29

需要源码的朋友我就提供一个patloew大神写的MVVM模式中有用到@Binds的Demo,可以去对照运行。还有不懂的可以在下面留言。可以相互交流。
附上链接:GitHub - patloew/countries: An example Android app using Retrofit

相关文章

网友评论

  • MrLuo:还是没理解@Binds起到了什么作用。
    655a1751b9cc:那userservice从哪里提供呢?
    王者梦回Arvin:就是使用@binds的方法来替代HomeModule中的provide方法了。只是扩展的一种形式

本文标题:关于Dagger2中@Binds的使用

本文链接:https://www.haomeiwen.com/subject/rkvtyttx.html