コンストラクターでいくつかのパラメーターを渡しながら、いくつかのクラスを注入しようとしています。それを達成するために、この質問 ( 1、2 )を見つけました。これは、ファクトリでアシスト インジェクションを使用することで達成できると言っています。これは、提供された例と関連ドキュメントを読んだ後のいくつかの変更に従って、私のコードがどのように見えるかです。
グラドルスクリプト
dependencies {
compile 'org.roboguice:roboguice:3.+'
provided 'org.roboguice:roboblender:3.+'
compile 'com.google.inject.extensions:guice-assistedinject:3.+'
}
パラメータを受け取る create メソッドを含むファクトリ インターフェイス
public interface ICustomObjectFactory {
ICustomObject create(Callback callback);
}
インターフェイスを実装するクラス
public class CustomObject implements ICustomObject {
protected String name;
@AssistedInject
public CustomObject(@Assisted Callback callback){
this.callback = callback;
}
}
Aplication クラスから使用および呼び出されるモジュール
public class SomeModule extends Module {
@Override
protected void configure() {
install(new FactoryModuleBuilder()
.implement(ICustomObject.class, CustomObject.class)
.build(ICustomObjectFactory.class));
}
}
Application クラスから登録されたインジェクション モジュール
@Override
public void onCreate() {
super.onCreate();
RoboGuice.getOrCreateBaseApplicationInjector(this, RoboGuice.DEFAULT_STAGE,
RoboGuice.newDefaultRoboModule(this), new SomeModule(this));
}
工場の利用
public class SomeClass implements Callback {
@Inject ICustomObjectFactory factory;
public SomeClass () {
ICustomObject first = this.factory.create(this);
}
}
このようなすべてで、ファクトリを使用しようとすると、このエラーが発生します。SomeClass
java.lang.IllegalStateException: Factories.create() factories cannot be used until they're initialized by Guice.
at com.google.inject.internal.util.$Preconditions.checkState(Preconditions.java:142)
at com.google.inject.assistedinject.FactoryProvider2.getBindingFromNewInjector(FactoryProvider2.java:564)
at com.google.inject.assistedinject.FactoryProvider2.invoke(FactoryProvider2.java:625)
at java.lang.reflect.Proxy.invoke(Proxy.java:397)
at $Proxy12.create(Unknown Source)
Factoryが初期化されていない理由を誰かが知っていますか? モジュールによって初期化する必要があることを理解しており、それが呼び出されたモジュールであると確信しています。
私のコードとリンクされた質問のコードとの最も顕著な違いは、質問では、コンストラクターに@Inject
ではなくで注釈が付けられていること@AssistedInject
です。この変更の前は、アプリのコンパイル中にこのエラーが発生していました。
エラー: タスク ':app:compileDebugJavaWithJavac' の実行に失敗しました。java.lang.ClassCastException: com.sun.tools.javac.code.Type を javax.lang.model.type.DeclaredType にキャストできません ドルの依存キャッシュが破損している可能性があります (これは、ネットワーク接続のタイムアウト後に発生することがあります)。依存関係と同期プロジェクト (ネットワークが必要)
Gradle ビルド プロセス (デーモン) の状態が破損している可能性があります。すべての Gradle デーモンを停止すると、この問題が解決する場合があります。Gradle ビルド プロセスを停止します (再起動が必要です) プロジェクトで、プロジェクト内の他のプラグインまたはプロジェクトが要求する Gradle のバージョンと互換性のないサードパーティのプラグインを使用している可能性があります。 Gradle プロセスが破損している場合は、IDE を閉じてからすべての Java プロセスを強制終了することもできます。
たぶん、これは私が必要とするものを達成するための最良のアプローチではありません. そうでない場合、誰かが私に正しい方向を向けることができますか?
ご協力ありがとうございました