16

Guiceを使用して、

@Inject @Named("light")
Color light;

使うことができます

bind(Color.class).annotatedWith(Names.named("light"))
    .toInstance(new Color("white"));

Colorコンストラクターが色名のみを必要とする場合にそれを白色にバインドします。

しかし、ColorコンストラクターがGuiceによって作成されたオブジェクトも必要とする場合、どうすればよいですか?例えば:

@Inject
public Color(ColorSet colorset, String colorName) {...}

ここで、colorsetは実行時にGuiceによって作成され、configure(){...}では使用できません。

私はそれなしでやりたいです:

  • 注入する必要のある色ごとにクラス/サブクラスを作成する(WhiteColorなど)
  • コードで直接リフレクションを使用する
  • ColorFactoy factory; factory.get("light");代わりに使用するようにクラスを変更する@Named("light") Color light;
4

3 に答える 3

34

これを行う最良の方法は、ファクトリではなく@Providesメソッドを使用することです。私の会社はGuiceを非常に広範囲に使用しておりrequestInjection、暗黙の依存関係の非常に壊れやすいグラフを簡単に設定できるため、常に悪い考えと見なされています。

次のようになります。

public class FooModule extends AbstractModule {
  protected void configure() {
    // do configuration
  }

  @Provides
  @Named("white")
  Color provideWhiteColor(ColorSet colorSet) {
    return colorSet.white(); // or whatever
  }

  @Provides
  @Named("black")
  Color provideBlackColor(ColorSet colorSet) {
    return colorSet.black(); // or whatever
  }

  // etc
}
于 2012-09-06T23:18:48.593 に答える
4

モジュール内にファクトリをセットアップし、そのファクトリにインジェクションを要求してColorSetに入力することができます。

モジュール:

ColorFactory colorFactory = new ColorFactory();

requestInjection(colorFactory);

bind(Color.class).annotatedWith(Names.named("light")).toInstance(colorFactory.buildColor("white"));
bind(Color.class).annotatedWith(Names.named("dark")).toInstance(colorFactory.buildColor("black"));

ColorFactory:

public class ColorFactory {

    private ColorSet colorSet;

    public Color buildColor(String color){
        return new Color(colorSet, color);
    }

    @Inject
    public void setColorSet(ColorSet colorSet) {
        this.colorSet = colorSet;
    }
}
于 2012-09-05T22:12:37.867 に答える
1

特定のオブジェクトをフェッチするためにインジェクターを直接使用するのを見たコードベースはほとんどありません。

injector.getInstance(Color.class);

この場合、以下を使用できます。

injector.getInstance(Key.get(Color.class, Names.named("light")));
于 2020-12-14T07:17:41.230 に答える