10

Dropwizardを使い始めて、データベースを使用する必要があるコマンドを作成しようとしています。なぜ私がそうしたいのか疑問に思っている人がいれば、正当な理由を提供できますが、とにかくこれは私の質問のポイントではありません. それは、Dropwizard での依存関係の逆転とサービスの初期化と実行フェーズに関するものです。

Dropwizard は、DbiFactory を使用して DBI インスタンスを構築することを推奨していますが、インスタンスを取得するには、Environmentインスタンスおよび/またはデータベース構成が必要です。

public class ConsoleService extends Service<ConsoleConfiguration> {

  public static void main(String... args) throws Exception {
    new ConsoleService().run(args);
  }

  @Override
  public void initialize(Bootstrap<ConsoleConfiguration> bootstrap) {
    bootstrap.setName("console");
    bootstrap.addCommand(new InsertSomeDataCommand(/** Some deps should be here **/));
  }

  @Override
  public void run(ConsoleConfiguration config, Environment environment) throws ClassNotFoundException {
    final DBIFactory factory = new DBIFactory();
    final DBI jdbi = factory.build(environment, config.getDatabaseConfiguration(), "postgresql");
    // This is the dependency I'd want to inject up there
    final SomeDAO dao = jdbi.onDemand(SomeDAO.class); 
  }
}

ご覧のとおり、サービスとその環境の構成はそのrun()メソッドにありますが、そのメソッドのサービスのブートストラップにコマンドを追加する必要がありますinitialize()

これまでのところ、 Commands でConfiguredCommandDBIを拡張し、メソッド内にインスタンスを作成することでこれを実現できましたが、依存関係を 内に作成するのではなく、オブジェクトに注入する必要があるrun()ため、これは悪い設計です。

コンストラクターを介してコマンドの DAO またはその他の依存関係を注入することをおEnvironment勧めしますが、作成してブートストラップに追加する必要がある場合、サービスの初期化で構成にアクセスできないため、これは現在のところ不可能に思えます。

これを達成する方法を知っている人はいますか?

4

2 に答える 2

1

これが、私が Dropwizard で Guice を使用する方法です。run() メソッド内に次の行を追加します

Guice.createInjector(new ConsoleModule());

クラス ConsoleModule を作成します

public class ConsoleModule extends AbstractModule {

 public  ConsoleModule(ConsoleConfiguration consoleConfig)
 {
     this.consoleConfig = consoleConfig;
 }

 protected void configure()
{
   bind(SomeDAO.class).to(SomeDAOImpl.class).in(Singleton.class)
  }
}
于 2014-08-31T02:41:12.297 に答える