关于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