播种匕首2工厂与配置

问题描述 投票:0回答:1

我刚刚开始使用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();
  }
}
java dependency-injection dagger-2
1个回答
0
投票

你可以使用一个 @Component.Factory (或 @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();
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.