問題タブ [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.
android - @Provides アノテーション付きメソッドなしではコンテキストを提供できませんが、そうですか?
次の単純なモジュールがあります。
そして、それぞれの単純なコンポーネント:
そして、ここでコンポーネントを作成しています:
コンパイル時にこのエラーがスローされます:Error:(22, 13) error: android.content.Context cannot be provided without an @Provides-annotated method
が、ご覧のとおり、注釈が付けられてい@Provides
ます。
修飾子の注釈を外すと問題がなくなるので、本当に奇妙です。
念のため、これは私の@ForApplication
修飾子です:
これは実質的に教科書の Dagger2 の例です。私は何を間違っていますか?
java - Dagger2: モジュールによって提供される実装クラスをコンポーネント自体に注入する
の Dagger1 仕様を通じてモジュールがすべて相互に共有されていることを考慮すると、メソッドによって提供される要素をコンストラクター パラメーターを通じてcomplete=false, library=true
受け取ることができます。@Provides
Presenter
ただし、コンポーネント グラフを保持する依存関係 (またはインスタンス) を1 つだけ指定CustomApplication
し、そのコンポーネント グラフを使用して実装クラスを注入することもできます。
そうすれば、プレゼンターのオブジェクト グラフに依存するだけで済み、コンストラクターのパラメーターをいじる必要がなくなります。
どちらがより良いアプローチですか?
編集:あまりよくリファクタリングされていないプロジェクトで私が持っているより明確で具体的な例は次のとおりです:
それで
それで
質問:この方法では、すべての依存関係は、コンストラクターではなく、インジェクターの準備が整ったときにアプリケーションのコンポーネントから提供されます。しかし、これは良いアプローチですか?長期的には注意点はありますか?
EDIT2:ここにインジェクターを持っていましたが、かなり悪かったです。
java - Dagger 2: 提供されたクラスへの注入
Dagger がどのように機能するかを理解するのに少し苦労していますが、今回もコードがいくつかあります。
私はいくつかのクラスとそれぞれのインターフェースを持っています
そして、おおよそ次のようなコンポーネント
では、すべてのインジェクションが正しく行われるSomeView
viaのインスタンスを作成するには、他に何が必要でしょうか?getSomeView
私はそれをしようとしまし@Module(includes = DataModule.class)
た@Provides ISomeView provideISomeView()
(または、provideISomeView(IDataProvider dataProvider)
少なくともDataProvider
上記のメソッドで正しいインスタンスを提供します)が、何を試してIDataProvider
も、モジュール内またはSomeManager
コンストラクター自体-そのようなステートメント@Inject
は無意味になります。
java - Dagger2 モジュール: 提供したいクラスのコンストラクターに渡すコンテキストを取得する方法
Dagger2 を初めて使用します。
私のAndroidアプリケーションには、Applicationを拡張するMyApplicationクラスがあります。関連する画像処理メソッドのコレクションである ImageAssistant クラスもあります。私の MyApplicaiton クラスでは、使用するすべてのアクティビティに対して ImageAssistant をインスタンス化していました。
現在、Dagger2 で動作させようとしていますが、ImageAssistant を提供するモジュールでコンテキストを渡す方法がわかりません
これは私のコードがどのように見えたかです:
さあ、ダガー2に入ってください、これが私が持っているものです
パッケージ内 .modules:
編集:これが私のモジュールの現在の外観ですが、すべてを結び付ける方法はまだわかりません:
これが AppComponent です。
java - Dagger 2 の Component 用に生成されたクラスが、Gradle の Java Plugin の compileTestJava に見つかりません
さて、私は自分の Android プロジェクトをクリーン アーキテクチャを使用するように移行しています。
https://github.com/android10/Android-CleanArchitecture
これは、コードの一部がドメイン モジュール内にあることを意味します (純粋な Java、Android との依存関係はありません)。このプロジェクトでは、(コンパイル時に) 注釈プロセッサを使用してソースを生成する Dagger 2 を使用しています。
私のプロジェクトには、次の Gradle の構成があります。
私のテスト ソースでは、インターフェイス TestComponent を作成し、Dagger は DaggerTestComponent を生成することになっています。コマンドラインまたは Android Studio を使用してプロジェクトをビルドしようとすると、「シンボルが見つかりません」というコンパイル エラーが発生し、「タスク ':domain:compileTestJava' の実行に失敗しました」というメッセージが表示されます。
'compile' と 'testCompile' で 'provided' を変更しようとしました。まだ機能していません。
奇妙なのは、compileTestJava が失敗した後、生成された DaggerTestComponent.java がdomain/build/classes/testにあることです。では、それが生成されている場合、なぜこのコンパイル エラーが発生するのでしょうか?
この問題はテスト ソースでのみ発生することに注意してください。メイン ソースで使用されている Dagger 2 のソースを生成しました。
アップデート:
DaggerTestComponent を使用しようとしていたすべての場所にコメントし、再度ビルドを試みました。domain/build/classes/testで、DaggerTestComponent.java だけでなく、コンパイルの結果の .class も見つけることができます。つまり、ソースファイルを生成してコンパイルしています。それを使用したファイルのコンパイルが機能しないのはなぜですか? 生成されたソースは、他のソースのコンパイル時にまだ準備ができていないなど、順序の問題のようです。