Android Dagger如何在代码中注入一个实现

Android Dagger如何在代码中注入一个实现,android,dagger-2,Android,Dagger 2,我是安卓开发者,是一个全新的清洁架构 我有一个usecase1类,通过构造函数注入存储库实例: public class usecase1 { public final Repository repository; @Inject public usecase1(Repository repository) { this.repository = repository; } List<String> getlist(){

我是安卓开发者,是一个全新的清洁架构

我有一个
usecase1
类,通过构造函数注入
存储库
实例:

 public class usecase1 {

    public final Repository repository;
    @Inject
    public usecase1(Repository repository) {
        this.repository = repository;
    }

    List<String> getlist(){
        return repository.list();
    }
}

我的问题是如何注入适当的依赖关系。以及如何说出注入离线或在线用例的dagger。

在没有看到我询问的其他方面的情况下,我只能提供这么多建议,而不是猜测。换句话说,帮我帮你

在提供
usecase1
实例的
模块中,您可以执行以下操作:

@Module
class MyModule {
  // if you're provided qualified references for the usercase1 class
  // itself, then you could provide two implementations that use the same
  // qualifier as the Repository types they depend on (or choose another 

  @Provides @Named("Online")
  Repository provideOnlineUsecase1(@Named("Online") repository) {
    return new usecase1(repository);
  }

  @Provides @Named("Offline")
  Repository provideOfflineUsecase1(@Named("Offline") repository) {
    return new usecase1(repository);
  }

  // ...alternatively, if you're not providing qualified references of
  // usecase1 you can simply pick one. this might be the case if you're 
  // doing some manual testing and don't mind periodically rebuilding the
  // project switching between "Online" and "Offline":

  @Provides 
  Repository provideUsecase1(@Named("Offline") repository) {
    return new usecase1(repository);
  }
}
@Module
class MyModule {
  @Provides @Named("Online") 
  Repository provideOnlineRepository() {...}

  @Provides @Named("Offline") 
  Repository provideOfflineRepository() {...}

  @Provides
  Supplier<Boolean> provideIsConnectedSupplier() {...}

  @Provides
  Repository provideUseCase(
    Supplier<Boolean> isConnectedSupplier,
    @Named("Online") Repository onlineRepository,
    @Named("Offline") Repository offlineRepository) {

      return new usecase1(
        isConnectedSupplier, 
        onelineRepository, 
        offlineRepository);
  }
}
关键的一点是,您的限定
存储库
实例是通过在消费提供者方法中将它们引用为使用相同命名限定符注释的参数来绑定的

换句话说,由于
offlinerepository
提供了@Named(“Offline”)限定符,需要它的另一个提供程序可以通过将其声明为
Repository
类型的参数来引用它,并用@Named(“Offline”)注释

作为旁白。。。从广义上讲,您的类型(
usecase1
Repository
)通常只需要一个单例实例,但我在代码片段中没有看到任何作用域修饰符

请记住,多分享一些你的问题可能会得到更好的反馈。我希望我能帮上忙

**更新**

从您的评论来看,您似乎想知道如何根据动态计算的值(如网络连接状态)在两个不同的
存储库
实现之间切换。在这种情况下,我可能会这样做:

@Module
class MyModule {
  // if you're provided qualified references for the usercase1 class
  // itself, then you could provide two implementations that use the same
  // qualifier as the Repository types they depend on (or choose another 

  @Provides @Named("Online")
  Repository provideOnlineUsecase1(@Named("Online") repository) {
    return new usecase1(repository);
  }

  @Provides @Named("Offline")
  Repository provideOfflineUsecase1(@Named("Offline") repository) {
    return new usecase1(repository);
  }

  // ...alternatively, if you're not providing qualified references of
  // usecase1 you can simply pick one. this might be the case if you're 
  // doing some manual testing and don't mind periodically rebuilding the
  // project switching between "Online" and "Offline":

  @Provides 
  Repository provideUsecase1(@Named("Offline") repository) {
    return new usecase1(repository);
  }
}
@Module
class MyModule {
  @Provides @Named("Online") 
  Repository provideOnlineRepository() {...}

  @Provides @Named("Offline") 
  Repository provideOfflineRepository() {...}

  @Provides
  Supplier<Boolean> provideIsConnectedSupplier() {...}

  @Provides
  Repository provideUseCase(
    Supplier<Boolean> isConnectedSupplier,
    @Named("Online") Repository onlineRepository,
    @Named("Offline") Repository offlineRepository) {

      return new usecase1(
        isConnectedSupplier, 
        onelineRepository, 
        offlineRepository);
  }
}
@模块
类MyModule{
@提供@Named(“在线”)
存储库提供OnlineRepository(){…}
@提供@Named(“脱机”)
存储库provideOfflineRepository(){…}
@提供
供应商提供连接的供应商(){…}
@提供
储存库蛋白酶(
供应商是连接的供应商,
@命名(“在线”)存储库onlineRepository,
@命名(“脱机”)存储库(脱机存储库){
返回新用例1(
未连接的供应商,
onelineRepository,
离线存储库);
}
}
在此设置中,
usecase1
被赋予一个对象,它可以查询该对象以查看其是否有网络连接,然后使用与结果相对应的
存储库。这样做的好处是,您可以独立开发和测试所有组件,并且使用Dagger只是组装它们(而不是将切换逻辑放入模块中)


从设计角度来看,您可以做得更好(例如使用流),但希望这足以激发一些想法。

您能分享您的模块和组件代码吗?@homerman我认为这些类并不重要。在我的viewmodel构造函数中,我注入了存储库。我如何说匕首,哪个存储库注入离线或在线。对不起,我编辑我的答案。我的意思是,在viewmodel中,我注入了用例如何注入适当的实例。我有一个条件是连接状态。我是否可以在模块中使用连接状态。也许我可以用它来制造工厂。并返回合适的用例。好的,我想我明白了。请参阅我答案的更新。如果这不是你说的,请告诉我。非常感谢,当然,我想到了。但问题是,我们将两个存储库实例传递给域层,这并不好,也许明天我们将有3个或4个存储库。我使用rxjava来实现这个场景,还不错。但它并不适合meI,因为meI可能会将基于连接的切换逻辑推到一个
存储库中,该存储库充当
OnlineRepository
OfflineRepository
的门面,或者将这两个存储库合并到一个基于连接状态管理自身的
存储库中。这样,您的用例就不必考虑连接状态(针对您的观点)。