使用配置播种 Dagger 2 Factory

Seeding Dagger 2 Factory with Config

我刚刚开始使用 Dagger 和依赖注入,想知道一些较低级别的依赖项在运行时的配置。有没有办法在运行时为低级注入的 Singleton 提供配置对象?

我所追求的基本想法:

@Singleton
class DatabaseService {
   @Inject
   public DatabaseService(DatabaseConnectionConfig config) { // how can this arg be passed in at runtime?
      // make the connection
   }
}

@Singleton
class HighLevelService {
   @Inject
   public HighLevelService(DatabaseService db) {
   }
}

@Module
class Module {
  @Binds
  abstract HighLevelService bindHighLevelService(HighLevelService svc);

  @Binds
  abstract DatabaseService bindDatabaseService(DatabaseService svc);
}


@Singleton
@Component(modules = {
    Module.class
})
interface Factory {
  HighLevelService highLevelService();

  static Factory create() {
    return DaggerFactory.create();
  }
}

public class App {
  public static void main(String[] args) {
    // get the config details from the arguments
    DatabaseConnectionConfig config = parseDBConfigFromArgs(args);
    // is there a way to configure the DatabaseConnectionConfig from here?
    HighLevelService svc = Factory.create().highLevelService();
  }
}

您可以将 @Component.Factory (or @Component.Builder) 与 @BindsInstance 一起使用。

@Singleton
@Component
interface Factory {
    HighLevelService highLevelService();

    // This nested interface is typically called "Factory", but I
    // don't want to look up how to access Factory from Factory.Factory
    @Component.Factory
    interface MyFactory {
        Factory create(@BindsInstance DatabaseConnectionConfig config);
    }

    static Factory create(DatabaseConnectionConfig config) {
        return DaggerFactory.factory().create(config);
    }
}

public class App {
  public static void main(String[] args) {
    DatabaseConnectionConfig config = parseDBConfigFromArgs(args);

    HighLevelService svc = Factory.create(config).highLevelService();
  }
}