0

Guice を使い始めたばかりで、Guice の注入方法を理解するのに苦労しています。私はSpringに精通していますが、これは少し違うようです。

私はDAOクラスを持っています:

public class SomeDAO {
    @NotNull
    private DB db = null;

    public SomeDAO (String databaseName) throws Exception{
        xxxxxxxxxxxxxxxxxxxxxxxx
    }
}

私はコントローラーを持っています。

public class SomeController {
    private SomeDAO someDAO;
}

ここでguiceを使用してsomeDAOオブジェクトを注入するにはどうすればよいですか? SomeDAO コンストラクターの databaseName は SomeController から提供される必要があることに注意してください。

ありがとう。

4

1 に答える 1

4

理想的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さらに注入された依存関係が必要になった場合は、同じ支援された注入を適用することもできます。

于 2013-07-03T19:34:02.383 に答える