問題タブ [dagger-2]

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 に答える
307 参照

java - Dagger 2 でグラフを作成できない

Dagger 2 Web サイトの例に基づいて、Dagger 2 で依存関係グラフを作成しようとしています (coffeeMaker とソースはこちら: https://github.com/google/dagger/tree/master/examples/simple )。

サイトに記載されているようにコンポーネントを作成しました:

注釈プロセッサは (ターゲット ディレクトリに) ファイルを正しく生成しますが、DaggerCoffeeShopクラスを見つけることができません。(Ctrl + スペース) は機能しません。

どうすればこの問題を解決できますか?

0 投票する
5 に答える
19453 参照

java - Dagger 2 のシンボル クラス "Generated" が見つかりません

を使用して依存性注入を開始しDagger 2ました。をスピンアップしてアプリケーションをビルドしようとするとmodules、エラーがスローされましたcomponentsgradle

Error:(4, 24) error: cannot find symbol class Generated

私はそれを掘り下げて、エラーがDaggerdo を生成するクラスの 1 つにあることを発見しましたDI。欠落している特定のクラスjavax.annotation.Generatedは、エラーをスローする行は、Dagger生成されたクラスを次のように注釈する行です。@Generated("dagger.internal.codegen.ComponentProcessor")

この質問は、私のgradleビルドファイルにjavax行を追加することで、パッケージを依存関係として追加する解決策を見つけるのに役立ちました. compile 'org.glassfish:javax.annotation:10.0-b28'これにより、ビルドが成功しました。

私の質問は、なぜそれが推移的な依存関係として追加されないのか、Daggerまたは他の誰もこの特定の問題に直面していないのはなぜですか (これに関する質問がここで見つからなかったので、そう思いますか?

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

java - Dagger 2 とインターフェイスの実装

http://konmik.github.io/snorkeling-with-dagger-2.htmlに基づいて、単純な Dagger 2 テストセットアップを用意しました。すべての設定を出力する PreferenceLogger を挿入します。注入されたクラスでは、さらにクラスを @Inject できます。

これを実行すると、ロガーが設定され、PreferencesLogger.log 内で OkHttpClient が正しく設定されます。したがって、この例は期待どおりに機能します。今、私はMVP構造を整えようとしています。実装のある MainPresenter インターフェイスがあります。MainActivity で次を設定します。

そのため、この MainPresenter を別の (デバッグまたはテスト) 実装に切り替えることができました。もちろん、使用する実装を指定するモジュールが必要です。

OkHttpClient が注入されなくなったという問題が発生しました。もちろん、パラメーター OkHttpClient を受け入れるようにモジュールを変更することもできますが、これが推奨される方法ではないと思います。MainPresenterImpl が正しく注入されない理由はありますか?

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

android - ダガー 2 による動的バインディング

Android アプリを からDaggerに移行する際に問題がありDagger2ます。

私は Dagger を使用して、テスト中にさまざまなレイヤー (ユニット、機能デバイス、およびその間のすべて) にモックを挿入します。

たとえば、 aとaNetworkingModuleを提供する a があります。一部のテストでは http レイヤーをモックするだけで、他のテストでは をモックし、他のテストではリリース クラスを使用して実際のテスト サーバーとの統合をテストします。HttpTransportServerConnectorServerConnector

これらのテストは、すべてのビルド フレーバー (デバッグ、リリースなど) で実行できます。

Dagger2ビルドタイプごとに単一の静的注入構成を設定する説明のみを見つけました-つまり、実際のクラスをバインドするリリースコンポーネントと、1セットのモックをバインドするデバッグコンポーネント。

アプリケーションの起動段階で、モジュールをテスト ケースに置き換える方法を見つける必要があります。

どうすればこれを達成できますか?私の考えでは、アプリケーションがモジュールの静的注釈を持つ特定のインターフェースの実装であるコンポーネントを使用する必要があるグラフの構築をトリガーすると、常に行き詰まります???

別の質問: 同じインジェクションを提供する同じビルドで複数のモジュールをコンパイルすることは可能ですか? 実行時に適切なモジュールを挿入するにはどうすればよいですか?

私の例のNetworkingModule.

Espressoところで:私は、Robolectric、およびを多用していますMockito

どうも。

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

java - アノテーション処理を使用した Dagger2 グラフへの遅延バインディング

この質問では、Dagger2について話します。Dagger2 は、基本的にコンポーネントとモジュールで構成されています。次に例を示します。

私はインターフェースを持っていると仮定します:

可能な実装:

Dagger2 生成を使用して、実装をインターフェイスにリンクできます。

これは、Dagger2 の簡単な紹介でした。ここで、次のインターフェースがあるとします。

コード内の実装はありませんMySecondCoolServiceImplMySecondCoolService代わりに、@JustForCoolStuffフィールドとメソッドをマークする注釈があります。MySecondCoolServiceImplこれらすべての注釈を収集し、どの実装を生成する注釈プロセッサを作成しましたMySecondCoolService

MySecondCoolService注釈プロセッサが実行される前に、コンパイラは新しいインターフェイスを認識します。したがって、コンポーネントを次のように変更できます。

問題は、コードにまだ実装がなくMySecondCoolService、注釈プロセッサによって生成される実装の名前がわからないことです。したがって、 で正しい実装を使用してインターフェイスを配線することはできませんMyModule。私にできることは、新しいモジュールを生成するように注釈プロセッサを変更することです。私の注釈プロセッサは、次のようなモジュール ( MyGeneratedModule)を生成できます。

再度MyGeneratedModule、注釈プロセッサによって生成されます。注釈プロセッサを実行する前にアクセスできません。また、名前もわかりません。

問題は次のとおりです。注釈プロセッサは、Dagger2 が考慮すべき新しいモジュールがあることを Dagger2 に通知する必要があります。注釈プロセッサはファイルを変更できないため、@Component(modules = {MyModule.class})注釈を拡張して次のように変更することはできません。@Component(modules = {MyModule.class, MyGeneratedModule.class})

MyGeneratedModuleプログラムでdagger2依存関係グラフに追加する方法はありますか? 上記で説明したように、注釈プロセッサはどのようにしてインターフェイスと実装の間に新しい配線が必要であることを Dagger2 に伝えることができますか?


Foray: Google GuiceGoogle Gin でそのようなことができることは知っています。それを行うプロジェクトがGWTPです。そこにプレゼンターがあります:

インターフェイスへの@NameToken注釈がありProxyPlaceます。AbstractPresenterModuleプレゼンターとプロキシを使用してビューを配線します。

ご覧のとおり、MyProxyインターフェイスの実装は指定されていません。Generator によって作成された実装 (アノテーション プロセッサに似ていますが、GWT 用)。そこでジェネレーターはの実装を生成し、StartPagePresenter.MyProxyそれをガイド/ジン システムに追加します。


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

dagger-2 - コンストラクター注入を使用してオブジェクトを作成する方法は?

Cat を提供するコンポーネントを使用して Dog のインスタンスを作成するにはどうすればよいでしょうか。

Dagger 2 をしばらく試した後、コンストラクター インジェクションの使用方法がわかりません。ヒントをいただければ幸いです。

編集:
質問の何が問題になっていますか?Dagger 2 を使用した後、いくつかのチュートリアルに従い、公式ドキュメントを読んだ後、コンストラクター インジェクション機能の使用方法がわかりません。そのため、ここで質問します。@Inject を使用して Cat 依存関係を Dog に注入する代わりに、Dog オブジェクトを提供する DogModule を作成することもできますが、Dog は単なる通常の Java クラスになります。フィールド注入はうまく機能します (使用方法を示す多くの例があります) が、コンストラクター注入を使用するには何をする必要がありますか?

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

android - Dagger2 androidTest エラー重複エントリ: javax/annotation/Generated.class

DIにはDagger2を使用しています。私のプロジェクトに:commonは、ライブラリである:appモジュールと実際のアプリケーションであるモジュールの 2 つのモジュールがあります。

ライブラリモジュールには、モジュールAndroidAppで拡張MultiDexApplicationおよび継承されるものがあり:appます。Google の dagger2 のに従って、Dagger2 で DI を追加しました。

アプリを実行するたびに、次のメッセージがエラーとして表示されます。

しかし、奇妙な部分は、Android Studio が言うことBUILD SUCESSFULLであり、アプリは問題なく実行されます。

ライブラリ モジュールでテスト (androidTest) を実行しようとすると:common、次のエラーが発生します。

これら 2 つのエラーの間に関連性はないと思いますが、何が起こっているのか、テストを修正する方法について何か知っている人はいますか?

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

android - Dagger2 カスタム スコープ : カスタム スコープ (@ActivityScope) は実際にどのように機能しますか?

私はGitHub でDagger2 Component Scopes Testのソース コードを読んでおり、アクティビティ用に定義された「カスタム スコープ」を見てきましたが、そのスコープを持つ@ActivityScope4 モジュールのCleanArchitecture@PerActivityを含む他のプロジェクトでそれを見てきました。

しかし文字通り、@ActivityScope注釈のコードは次のとおりです。

モジュールで「魔法のように」使用できます。

またはCleanArchitectureの例:

これがJSR-330カスタムスコープに関係していることははっきりとわかりますが、このコードが特定のモジュールおよび/または特定のモジュールによって提供されるものを有効にするために、ここで何が起こっているのか正確にはわかりませ実際のライフサイクルに依存しActivity、単一のインスタンスのみが存在しますが、その特定のアクティビティがアクティブな場合のみです。

ドキュメントには次のように書かれています。

Component docs pageを見るように言われていますが、404が表示されます。これも見ましが...

このカスタムスコープを指定すると魔法のように問題なく動作する理由を明確にするために、助けを求めてもActivity-level scopesよろしいですか?

(答えは、サブスコープはそのスーパースコープから依存関係を受け取ることができ、サブスコープはコンポーネントが存在する限り存在するということです。また、モジュールでスコープを指定する必要があり、1 つのスーパースコープをサブスコープするためにコンポーネントの依存関係を指定する必要があります。 )