誰かがThing
を求めたら、私は彼らにLegacyThing
を与えたいと思います。しかし、もし彼らが@Modern Thing
を求めるなら、私は彼らにThing
を与えたいと思っています。Guice:他にバインドされている実装タイプにバインドしますか?
これは動作しません:
bind(Thing.class).to(LegacyThing.class);
bind(Thing.class).annotatedWith(Modern.class).to(Thing.class);
代わりに直接Thing
への、第一の結合への第二の結合のリンクからです。
別のバインドへのリンクではなく、実装としてThing
にバインドするにはどうすればよいですか。
Thing
をインスタンス化する必要はありません。なぜなら、インジェクタに対処する必要がある依存関係がたくさんあるからです。私はむしろそれをサブクラス化したり、そこからインターフェイスを抽出したりすることもありません。
私が作ってみた最高のアイデアは、バインディングのコンストラクタを使用することですが、それはハック感じ:
bind(Thing.class)
.annotatedWith(Modern.class)
.toConstructor((Constructor<Thing>) InjectionPoint.forConstructorOf(Thing.class)
.getMember());
あなたのアプローチはかなり(カスタム悪いです 'Provider'を、使用することを除いて)動作する唯一の方法です。 –
もう一つのアプローチは、 'Thing'が抽象的で、' LegacyThing'と 'ModernThing'サブクラスを持つようにリファクタリングすることです。 –