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
勧めしますが、作成してブートストラップに追加する必要がある場合、サービスの初期化で構成にアクセスできないため、これは現在のところ不可能に思えます。
これを達成する方法を知っている人はいますか?