問題タブ [guice-3]

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.

0 投票する
1 に答える
3613 参照

java - Guice - フィールド インジェクションの制限事項

フィールド インジェクションを使用してBeanという別のクラスに依存する というクラスがあり、これらのクラスのコードを変更できないとします。別のクラス ( ) は、いつでも Bean の新しいインスタンスを構築するために を使用します。これらのクラスのコードは自由に変更できます。ServiceAppProvider

のメソッドProviderでは、演算子get()を使用して新しいインスタンスが作成されるため、 を に注入することはできません。そのため、インスタンスは不完全になります (サービス フィールドは になります)。newServiceBeanBeannull

この問題を回避する 1 つの方法Injectorは、プロバイダーにを挿入し、新しいインスタンスでメソッドinjector.injectMembers()を呼び出すことです。get()

コードの例は次のとおりです (コードを短くするためにインターフェイスを使用することは避けました)。

もう 1 つの方法は、コンストラクション インジェクションを使用するように Bean を変更することですが、前述したように、それができないと仮定しましょう。

ほとんどの人Injectorは、インジェクターはアプリケーションのエントリ ポイントでのみ使用し、それ以外の場所では使用しないため、DI の哲学全体を壊すため、避けるべきだと主張していますが、Guice はアプリで DI を使用するさまざまな方法を提供しているため、フィールド インジェクションなど、私が説明したような状況が発生する可能性があります。また、いくつかのプロジェクトでフィールド インジェクションがかなり頻繁に使用されているのを見てきました。

Injectorそれで、私が説明した問題に注入するのを避けるための「よりクリーンな」方法はありますか?

0 投票する
1 に答える
178 参照

guice - CLI アプリのネストされたクラスへの Guice インジェクション

MyBatis と Guice によるインジェクションを使用して、Oracle データベースに接続するコマンド ライン インターフェイス アプリケーションを作成しています。

私の質問は、ネストされたクラスの注入です。私のクラス構造はこのように見えます

ここで、ユーザーがログインとパスワードをアプリに入力する必要があります (構成ファイルに入力することはできません)。そのため、Main は MyInjector を初期化し、そこからインジェクター オブジェクトを取得し、それを使用して Menu1 を注入および初期化します。問題は、一度 Menu1 に入ると、MenuA に移動する必要があり、MenuA はサービスを注入する必要があり、これがどれだけ深くなるか誰にもわかりません。

さて、私の最初の考えは、MyInjector をシングルトン クラスにして、必要な場所でそのインスタンスを常に取得し、最初に Main クラスによって作成されたインジェクター フィールドを取得することですが、もっと良い方法があるかどうかちょっと興味があります。

これを行うためのよりGuiceyの方法はありますか?

0 投票する
2 に答える
253 参照

java - 引数または同等のものを含まない Guice 支援の注入されたファクトリからインスタンスをエレガントに提供することは可能ですか?

さて、次のコードは失敗します。ただし、View の潜在的なインスタンスが複数ある場合、それらを使用したい場所に多数の Provider プロバイダーを挿入するのは扱いにくいと感じます。私の場合は可能かもしれませんが、他の場合はこれがうまくいかないことも想像できます. まだ試していない解決策の 1 つは、ダミーの @Assisted 引数をメソッドに追加して factory.getView1(null) のように呼び出すことですが、これもあまり良くありません。

注: Guice の実装者にとって、これがまれなケースになる理由はわかります。なぜなら、guice はコンストラクターを呼び出すのではなく (そうであるように)、代わりに (技術的に認識されている) プロバイダーを使用する必要があるからです。それでも、解決策がないと仮定するよりも、解決策があるかどうかを尋ねる方が適切です。:-)

追加のコンテキスト

アランは以下に尋ねました「これを使用する(インジェクターを呼び出さない)実際のコードの例を教えてくださいそれを行ったプレゼンターのフレーバーごとにメソッドを提供します)」

そのため、フローティング レイアウトのカードとして視覚化されたプレゼンターがあります。このプレゼンターには、一連のサービスを使用して自身を構成する特定のビジネス ロジックがあります。アプリには「新規」ボタンがあり、新しいプロセス (カードの構成) を案内するカードのビューを提供します。カードが構築されると、カードを表す別のビューがあります...しかし、同じビジネスロジックの多くを共有しています...したがって、理想的には、モデルで既に構成されているプレゼンターを再利用したい..しかし、今は添付します構築されたビュー。永続化されたカードは、ビルド ビューで再作成されます。その議論に従っていない限り、読まないでください。

上記のコードは、私が抱えている問題を適切に抽出していることに注意してください。以下は、より完全なコンテキストを提供するため、物事を複雑にします。

0 投票する
1 に答える
4793 参照

java - Guice でバインディングまたは子モジュールをオーバーライドする

依存性注入ツールを使用しない Web アプリケーションの隣にある Google Guice を使用してコンポーネントを作成しています。

コンポーネントの Guice モジュールには、変更されないいくつかの「固定」バインディングと、Web アプリケーションからのすべてのリクエストで変更されるため動的なバインディングがいくつかあります。

私がこれを解決した簡単な (そして悪い) 方法は、Web アプリケーションが初めてコンポーネントに何かを要求するたびに、コンポーネントが新しい Guice モジュールを構築し、インスタンスを作成して Web アプリに返すことです。

リクエストごとにインジェクターを構築するのはコストがかかるため、これは悪いアプローチだと思います。私が欲しいのは、実行時にオーバーライドできる作成済みのインジェクターです。私は周りにいくつかのものを見つけました:

1-動的バインディングをオーバーライドします(https://stackoverflow.com/a/531110/1587864に回答してください)。これにはまだ新しいインジェクターを作成する必要があるため、同じ問題が発生します。

2- Injector に既にバインドされており、Web アプリケーションから取得され、要求ごとの「動的」プロパティにアクセスできるある種の Factory を実装します。

2番目のものを実装する方法がわかりません.この概念はGuiceに存在しますか?

ありがとう

0 投票する
2 に答える
119 参照

java - Guice - java.lang.class へのバインディングを作成する

Guice が何らかの方法でクラス型をインターフェイスにバインドするための巧妙な方法 (もしあれば) はありますか? クラスのインスタンスを意味するのではなく、実際の java.lang.class 型自体を意味します。

すなわち(明らかに動作しませんが、私が求めているものを伝えます):

最初は不可能に見えることはわかっていますが、これを行うためのトリックがあるかどうかはわかりませんでした。頭に浮かぶのは、実際にインスタンス化されたオブジェクトなどでクラス型をラップすることですが、それは最後の手段のようです。

どんなアイデアでも大歓迎です。ありがとう!