0

複数の場所からGuiceインジェクターを参照することが唯一の解決策であると思われるユースケースがありますが、これは一般的に推奨されていません。

私のアプリケーションは、オープンソースのETLプラットフォームであるTalendの上に構築されています。私の実際のアプリケーションのほとんどは、Talendコンポーネントによって呼び出されるJavaクラスにあります。これらのコンポーネントには、私が作成したJavaスニペットが含まれており、クラスをインスタンス化/呼び出します。

これで、Javaクラス全体でGuiceを使用するつもりですが、Talendコンポーネントに依存関係を注入する方法はまったくありません(Javaスニペットで使用できるようにするため)。代わりに、実際にこれらの依存関係を作成する必要があります。少なくともGuiceにインスタンス化を制御させたいのですが、これは、を使用する代わりにnew、クラス(コンストラクターを使用するクラス)をインスタンス化できる唯一の方法@Injectはを呼び出すことであるように見えることを意味しますinjector.getInstance。これは、インジェクターを維持する必要があることを意味します。おそらく、そもそもインジェクターを作成し、シングルトンとして利用できるようにする昔ながらの工場を使用しています。

私はこれを処理する他の方法を見ることができませんが、おそらく私は何かが欠けています。

4

2 に答える 2

3

静的注入を検討してください。これにより、アプリ全体でインジェクターへの永続的な参照が非表示になりますが、コードにinjector.getInstance(...)呼び出しを追加する必要がなくなります。いずれにせよ、Injector本当に必要な場合は注入することができます。

class TalendDependencyModule extends AbstractModule {
  @Override public void configure() {
    requestStaticInjection(ExtractorDependencies.class);
    requestStaticInjection(ProcessorDependencies.class);
  }
}

public class ExtractorDependencies {
  @Inject private static Provider<ParserService> parserServiceProvider;
  @Inject private static Provider<SomethingElse> somethingElseProvider;

  private ExtractorDependencies() { }

  static ParserService getParserService() {
    return parserServiceProvider.get();
  }

  /* ... */
}
于 2012-12-14T08:08:12.087 に答える
0

あなたが持っているTalendオブジェクトの数はわかりませんが、プロバイダーの使用を検討することをお勧めします。たとえば、Guiceに次の作成を管理させたい独自のクラスがあるとします。

public interface INotTalendControlled {}
public class NotTalendControlled implements INotTalendControlled {}

これは、Guiceを介して依存関係を注入できないTalendオブジェクトに追加されます(ただし、コンストラクターまたはセッターのいずれかを行うための手動プロセスがあると思います)。

public class TalendControlled {
        private INotTalendControlled notTalendControlled;

        private TalendControlled(INotTalendControlled notTalendControlled) {
            this.notTalendControlled = notTalendControlled;
        }

        public INotTalendControlled getValue() {
            return notTalendControlled;
        }
    }

GuiceにこれらのライフサイクルとTalend制御オブジェクトのライフサイクルを管理させたい場合は、次のようなプロバイダーを使用できます。

public static class TestModule extends AbstractModule {
            @Override
            protected void configure() {
                bind(INotTalendControlled.class).to(NotTalendControlled.class);
            }

            @Provides
            public TalendControlled provideInjectsToTalendObject(INotTalendControlled notTalendControlled) {
                return new TalendControlled(notTalendControlled);
            }
        }

@Providesメソッドは、TalendControlledオブジェクト(@Inject TalenControlled talendControlled)を直接注入できるようになり、依存関係を構築するために明示的なインジェクターが不要になるため、すべてのオブジェクトに対するnewの使用を非表示にします。

于 2012-12-14T14:41:50.320 に答える