問題タブ [assisted-inject]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Guice、FactoryModuleBuilder、複数の実装、ジェネリック
Guice と FactoryModuleBuilder を使用しています。通常、ファクトリーのインターフェースを定義するだけで十分で、Guice は自動的に実装を注入します。
ただし、私が苦労している部分は、ファクトリのメソッドがジェネリックを使用していることです。以下があるとします。インターフェイスによって定義された、構築されたインスタンスの基本型。
Foo
また、以下の 2 つのクラスで定義されているインターフェイスの 2 つの実装。
次に、複数の実装を使用できるようにする 2 つのカスタム バインディング アノテーションを使用して、以下に定義するファクトリ インターフェイスを作成します。
私は多くの可能な解決策を試しましたが、これまでのところ1つを除くすべてが機能しています。うまくいった解決策は、基本的にFooFactory
以下に示すように私自身の実装を書くことです。モジュールのconfigure
メソッドで、インターフェイスを実装にバインドします。bind(FooFactory.class).to(FooFactoryImpl.class);
ただし、このソリューションには 1 つの問題があります。インスタンスは Guice によって作成されないため、Guice に付属する null チェックが失われます。これは、この問題を抱えていない他の工場とは大きく異なります。これは、 のすべての実装に対して明示的に null チェックを書かなければならないことを意味しますFoo
。それは避けたいと思います。
以下は、私が試した解決策の一部です。
解決策 1:
解決策 2:
サンプル コードはGitHubで入手できます(興味がある場合)。
java - Guice 支援注入は既に構成されています
AssistedInject に問題があります。このリンクhttps://github.com/google/guice/wiki/AssistedInjectの指示に従いました が、アプリケーションを実行するとエラーが発生します:
ここに私のモジュール構成があります:
これが私の工場の様子です:
インターフェイスは次のように宣言されます。
そして、ここに実装があります
dropwizard guice バンドルを使用しています。
なぜこのエラーが発生するのですか?
java - アシストされていない依存関係をアシストするにはどうすればよいですか?
次のようなサードパーティ クラスがあるとします。
ここで、次のようなファクトリ インターフェイスがあるとします。
アイデアは、固定のMyObjectFactory
を構築するが必要だということです。つまり、基本的にコンストラクターパラメーターの注釈を外部から追加します。もちろん、手動で実装することは常に可能です。MyObject
Foo
@Assisted
Bar
MyObjectFactory
しかし、Guice でインスタンスをビルドする必要がある条件があるとしましょうMyObject
(メソッド インターセプターなど)。これは「インジェクターを注入する」ための仕事のようです:
これは邪悪でボイラープレートのように聞こえるので、代わりの実装や Guice にファクトリ impl を生成させる方法があるかどうか疑問に思っています。
java - Guice を使用して、Multibinder を FactoryModuleBuilder および Generics と連携させるにはどうすればよいですか?
Google guice - multibinding + generics + assistedinjectを読みましたが、私の特定のシナリオには答えていないようです。ここに私が持っているものがあります:
使用するインターフェースFactoryModuleBuilder
私の Guice モジュール:
他のすべてのフィルターを組み合わせるはずの私のメインフィルター:
それは実際には機能しません。そして、私は次のスタックトレースを取得します:
私はここで何か悪いことをしていますか?
java - Guice は、親インスタンスの注釈に基づいて異なるインスタンスを挿入します
アプリケーションで Guice フレームワークを使用しています。例に示すように、単一のクラスが同じインターフェイス C の複数のインスタンスを必要とするシナリオがあります (ただし、目的は異なります)。注釈機能を使用してこれを解決しようとしています。
以下の例に示すように、ConcreteImpl の構成も Guice によって注入されるようにします。しかし問題は、type1、type2、および type3 インスタンスの構成が異なる可能性があることです。これらのインスタンスの構成をアプリオリに持っていると仮定すると、構成を要求するインスタンスのコンテキスト (注釈で示される) に従ってそれらを注入する機能はありますか?
私のモジュールバインディングはこのようなものです -
そして、これは私がやりたいことのほとんどです
私はすでにファクトリを注入できる支援された注入を見てきましたが、それから factory.create(config) を使用しますが、コントラクトが少し醜くなる傾向があり、すべての構成が私のアプリケーションの開始とそれらを注入できるはずです。
java - Roboguice を使用した Factory での Android アシスト インジェクションが機能しない
コンストラクターでいくつかのパラメーターを渡しながら、いくつかのクラスを注入しようとしています。それを達成するために、この質問 ( 1、2 )を見つけました。これは、ファクトリでアシスト インジェクションを使用することで達成できると言っています。これは、提供された例と関連ドキュメントを読んだ後のいくつかの変更に従って、私のコードがどのように見えるかです。
グラドルスクリプト
パラメータを受け取る create メソッドを含むファクトリ インターフェイス
インターフェイスを実装するクラス
Aplication クラスから使用および呼び出されるモジュール
Application クラスから登録されたインジェクション モジュール
工場の利用
このようなすべてで、ファクトリを使用しようとすると、このエラーが発生します。SomeClass
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 プロセスを強制終了することもできます。
たぶん、これは私が必要とするものを達成するための最良のアプローチではありません. そうでない場合、誰かが私に正しい方向を向けることができますか?
ご協力ありがとうございました
java - テストでの AssistedInject の使用
いくつかのチュートリアルとマニュアルを読みましたが、それらはすべて、実際に必要な部分、つまり実際に実行する部分をスキップしています。
私のシナリオは次のとおりです。
私はConnection
インターフェースを持っています:
私は以下を必要とする本番環境の実装を持っていますSocketFactory
:
だから私は作成しましたConnectionFactory
:
今、私はSocketFactory
:SocketFactoryProd
との 2 つの実装を持っていSocketFactoryTest
ます。
Test forを作成していて、 withConnection
を作成したいのですが、正確な方法がわかりません。これは、私が見逃し続けている部分であり、テスト (またはテスト クラス) に記述する必要があります。ConnectionImpl
SocketFactoryTest
setUp
java - Guice で複雑なライフサイクルを管理する
データ オブジェクトのグラフがあり、このグラフのノードごとに 1 つのサービスを作成したい状況に遭遇しました。問題は、このサービス (およびその依存関係) が、対象のノードに依存していることです。このようなもの:
ここでの意図は、グラフ上のすべてのノードに対して、 の新しいインスタンスと、 の依存関係の新しいインスタンスを作成することです。Service
Service
だから今、私はいくつかのオプションがあります:
guice
支援された注入工場によって支えられています。これは私たちが現在行っていることであり、サービスが依存している場合は、ノードへの依存関係がすべてのサービスに依存している必要がありますnode
。つまり、ここで補助注入ファクトリーを使用すると、service
依存するクラスごとにそれを使用する必要があり、これは不快です。- ネストされたブートストラッパーと呼ばれるもの、つまり、新しいインジェクターを備えた新しいモジュール、事実上新しい環境を使用でき、その環境のセットアップで
bind(Node.class).toInstance(node)
. このコードは最初の訪問時に実行され、その結果がキャッシュされます。 - Guice のカスタム スコープを使用できます (と思います)。
私と私のチームがカスタム スコープを認識していなかったという理由だけで、いくつかの場所で 2 番目を実行しました。カスタム スコープの別の用途が 1 つありますが、それを実装するのは、私が望んでいたよりもはるかに複雑でした。このガイドに従うことは役に立ちますが、安全性の低い土地を掘り下げなければならないことは明らかであり、前回の訪問はそれほど楽しいものではありませんでした.
この動作を得るには、どの guice 機能を使用する必要がありますか?