問題タブ [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.
java - Dagger 2 でグラフを作成できない
Dagger 2 Web サイトの例に基づいて、Dagger 2 で依存関係グラフを作成しようとしています (coffeeMaker とソースはこちら: https://github.com/google/dagger/tree/master/examples/simple )。
サイトに記載されているようにコンポーネントを作成しました:
注釈プロセッサは (ターゲット ディレクトリに) ファイルを正しく生成しますが、DaggerCoffeeShop
クラスを見つけることができません。(Ctrl + スペース) は機能しません。
どうすればこの問題を解決できますか?
java - Dagger 2 のシンボル クラス "Generated" が見つかりません
を使用して依存性注入を開始しDagger 2
ました。をスピンアップしてアプリケーションをビルドしようとするとmodules
、エラーがスローされましたcomponents
gradle
Error:(4, 24) error: cannot find symbol class Generated
私はそれを掘り下げて、エラーがDagger
do を生成するクラスの 1 つにあることを発見しましたDI
。欠落している特定のクラスjavax.annotation.Generated
は、エラーをスローする行は、Dagger
生成されたクラスを次のように注釈する行です。@Generated("dagger.internal.codegen.ComponentProcessor")
この質問は、私のgradleビルドファイルにjavax
行を追加することで、パッケージを依存関係として追加する解決策を見つけるのに役立ちました. compile 'org.glassfish:javax.annotation:10.0-b28'
これにより、ビルドが成功しました。
私の質問は、なぜそれが推移的な依存関係として追加されないのか、Dagger
または他の誰もこの特定の問題に直面していないのはなぜですか (これに関する質問がここで見つからなかったので、そう思いますか?
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 が正しく注入されない理由はありますか?
android - ダガー 2 による動的バインディング
Android アプリを からDagger
に移行する際に問題がありDagger2
ます。
私は Dagger を使用して、テスト中にさまざまなレイヤー (ユニット、機能デバイス、およびその間のすべて) にモックを挿入します。
たとえば、 aとaNetworkingModule
を提供する a があります。一部のテストでは http レイヤーをモックするだけで、他のテストでは をモックし、他のテストではリリース クラスを使用して実際のテスト サーバーとの統合をテストします。HttpTransport
ServerConnector
ServerConnector
これらのテストは、すべてのビルド フレーバー (デバッグ、リリースなど) で実行できます。
Dagger2
ビルドタイプごとに単一の静的注入構成を設定する説明のみを見つけました-つまり、実際のクラスをバインドするリリースコンポーネントと、1セットのモックをバインドするデバッグコンポーネント。
アプリケーションの起動段階で、モジュールをテスト ケースに置き換える方法を見つける必要があります。
どうすればこれを達成できますか?私の考えでは、アプリケーションがモジュールの静的注釈を持つ特定のインターフェースの実装であるコンポーネントを使用する必要があるグラフの構築をトリガーすると、常に行き詰まります???
別の質問: 同じインジェクションを提供する同じビルドで複数のモジュールをコンパイルすることは可能ですか? 実行時に適切なモジュールを挿入するにはどうすればよいですか?
私の例のNetworkingModule
.
Espresso
ところで:私は、Robolectric
、およびを多用していますMockito
。
どうも。
java - アノテーション処理を使用した Dagger2 グラフへの遅延バインディング
この質問では、Dagger2について話します。Dagger2 は、基本的にコンポーネントとモジュールで構成されています。次に例を示します。
私はインターフェースを持っていると仮定します:
可能な実装:
Dagger2 生成を使用して、実装をインターフェイスにリンクできます。
と
これは、Dagger2 の簡単な紹介でした。ここで、次のインターフェースがあるとします。
コード内の実装はありませんMySecondCoolServiceImpl
。MySecondCoolService
代わりに、@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 GuiceとGoogle Gin でそのようなことができることは知っています。それを行うプロジェクトがGWTPです。そこにプレゼンターがあります:
インターフェイスへの@NameToken
注釈がありProxyPlace
ます。AbstractPresenterModule
プレゼンターとプロキシを使用してビューを配線します。
ご覧のとおり、MyProxy
インターフェイスの実装は指定されていません。Generator によって作成された実装 (アノテーション プロセッサに似ていますが、GWT 用)。そこでジェネレーターはの実装を生成し、StartPagePresenter.MyProxy
それをガイド/ジン システムに追加します。
dagger-2 - コンストラクター注入を使用してオブジェクトを作成する方法は?
Cat を提供するコンポーネントを使用して Dog のインスタンスを作成するにはどうすればよいでしょうか。
Dagger 2 をしばらく試した後、コンストラクター インジェクションの使用方法がわかりません。ヒントをいただければ幸いです。
編集:
質問の何が問題になっていますか?Dagger 2 を使用した後、いくつかのチュートリアルに従い、公式ドキュメントを読んだ後、コンストラクター インジェクション機能の使用方法がわかりません。そのため、ここで質問します。@Inject を使用して Cat 依存関係を Dog に注入する代わりに、Dog オブジェクトを提供する DogModule を作成することもできますが、Dog は単なる通常の Java クラスになります。フィールド注入はうまく機能します (使用方法を示す多くの例があります) が、コンストラクター注入を使用するには何をする必要がありますか?
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 つのエラーの間に関連性はないと思いますが、何が起こっているのか、テストを修正する方法について何か知っている人はいますか?
android - Dagger2 カスタム スコープ : カスタム スコープ (@ActivityScope) は実際にどのように機能しますか?
私はGitHub でDagger2 Component Scopes Testのソース コードを読んでおり、アクティビティ用に定義された「カスタム スコープ」を見てきましたが、そのスコープを持つ@ActivityScope
4 モジュールのCleanArchitecture@PerActivity
を含む他のプロジェクトでそれを見てきました。
しかし文字通り、@ActivityScope
注釈のコードは次のとおりです。
モジュールで「魔法のように」使用できます。
またはCleanArchitectureの例:
これがJSR-330カスタムスコープに関係していることははっきりとわかりますが、このコードが特定のモジュールおよび/または特定のモジュールによって提供されるものを有効にするために、ここで何が起こっているのか正確にはわかりません実際のライフサイクルに依存しActivity
、単一のインスタンスのみが存在しますが、その特定のアクティビティがアクティブな場合のみです。
ドキュメントには次のように書かれています。
Component docs pageを見るように言われていますが、404が表示されます。これも見ましたが...
このカスタムスコープを指定すると魔法のように問題なく動作する理由を明確にするために、助けを求めてもActivity-level scopes
よろしいですか?
(答えは、サブスコープはそのスーパースコープから依存関係を受け取ることができ、サブスコープはコンポーネントが存在する限り存在するということです。また、モジュールでスコープを指定する必要があり、1 つのスーパースコープをサブスコープするためにコンポーネントの依存関係を指定する必要があります。 )