关于Dagger2中@Binds的使用

 
 

在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



作者:王者梦回Arvin
链接:https://www.jianshu.com/p/8bb4651f0fbf
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

猜你喜欢

转载自blog.csdn.net/u013519084/article/details/79103014
今日推荐