0

私はこのように見えるいくつかのコードを持っています(簡略化):

public Reader newInstance(Catalog catalog) {
    Mapper mapper = new Mapper(catalog);
    return new Reader(mapper)
}

public main() {
    // expensive operation
    Catalog catalog = readCatalogFromDatabase();

    Reader reader = Reader.newInstance(catalog);
    // do stuff with reader
}

カタログを作成するようにこれを再設計するにはどうすればよいですか?GuiceはReaderとMapperを作成しますか?アシストインジェクションを使用してみましたが、CatalogはReaderに直接依存していないため、カタログオブジェクトを受け入れるファクトリメソッドを取得する方法がわかりません。

4

1 に答える 1

3

これを行うには、次の 2 つの方法があります。

  1. Guice でカタログをバインドします。これは、Catalog インスタンスをモジュールに渡すことを意味する場合がありますが、モジュールは任意の数のコンストラクター引数を取ることができるため、問題ありません。モジュールでは、これは次のようになります。

    bind(Catalog.class).toInstance(myVeryExpensiveCatalog);
    
  2. Catalog の不明なインスタンスまたは変更可能なインスタンスに基づいてリーダーを作成する必要がある場合は、アシスト インジェクションを使用するのが適切です。これは私がそれをどのように見せるかです:

    class Reader {
      interface Factory {
        Reader create(Catalog catalog);
      }
    
      @Inject Reader(@Assisted Catalog catalog, OtherDependency etc) {
        this.catalog = catalog;
      }
    }
    
    class YourModule extends AbstractModule {
      @Override public void configure() {
        install(new FactoryModuleBuilder().build(Reader.Factory.class));
      }
    }
    

    Reader.Factory次に、 を呼び出してリーダーを挿入して取得できますreaderFactory.create(catalog);。には任意の名前を付けることができ、任意の名前で任意の場所に配置できることに注意してください。これらは、私が好む名前と場所createです。Factory

さて、AssistedInject のドキュメントでは、 implement. がインターフェースの場合にのみこれを行う必要がReaderあるため、Guice はcreateの戻り値の型を満たすために構築する具体的なクラスの種類を認識します。

お役に立てれば!

于 2012-09-20T23:15:15.343 に答える