理想的SomeController
には、データベースの名前を知る必要はありません。これは構成ファイルまたはアプリケーション コンテキストから取得され、次のように DAO を挿入します。
public class SomeController {
private final SomeDAO someDAO;
@Inject
SomeController(SomeDAO someDAO) {
this.someDAO = someDAO;
}
}
次に、データベース名を挿入するには、次のようにします。
public class SomeDAO {
@NotNull
private DB db = null;
@Inject
public SomeDAO (@IndicatesDatabaseName String databaseName) throws Exception {
...
}
}
この場合、Guice が提供しますdatabaseName
( https://code.google.com/p/google-guice/wiki/BindingAnnotationsを参照)。コントローラーにデータベース名の知識を与えたい場合は、コントローラーから DAO を新規作成する (ただし、コントローラーを注入する) か、補助注入を使用することを検討できます。
編集:
コントローラーがデータベースについて本当に知る必要がある場合は、支援された注入を使用できます。
public class SomeController {
private final SomeDAO someDAO;
@Inject
SomeController(@Assisted String databaseName) {
this.someDAO = new SomeDAO(databaseName);
}
}
public interface ControllerFactory {
public SomeController create(String databaseName);
}
public static class MyModule extends AbstractModule {
@Override
protected void configure() {
install(new FactoryModuleBuilder()
.implement(SomeController.class, SomeController.class)
.build(ControllerFactory.class));
}
}
そして、必要なControllerFactory
場所に注入しSomeController
ます。SomeDAO
さらに注入された依存関係が必要になった場合は、同じ支援された注入を適用することもできます。