5

次のシナリオを作成しようとしています。

public interface DaggerInjectionFactory {
    void inject(MyActivity myActivity);
}

@Singleton
@Component(modules = {RestModule.class})
public interface MyRestComponent extends DaggerInjectionFactory {
    RestClient provideRestClient();
}

@Singleton
@Component(modules = {PreferencesModule.class})
public interface MyPreferencesComponent extends DaggerInjectionFactory {
    SharedPreferences provideSharedPreferences();       
}

ダガー コンパイラは、応答として次のエラーを返します。

error: RestClient cannot be provided without an @Provides- or @Produces-annotated method.

にはメソッドRestModuleが含まれており、ダガー コンパイラからを削除しても、コンポーネント ビルダーの生成に問題がない@Provides @Singleton RestClient provideRestClient()ことも注目に値します。extends DaggerInjectionFactoryMyPreferencesComponent

私がやろうとしているのは、@Injectアノテーションを使用したいすべての注入可能なクラスとのインターフェースを作成し、それらを私のコンポーネントの「すべて」に実装することvoid inject(MyActivity myActivity);です。 .

私はフレームワークに慣れていないため、正しい用語が何であるかがわかりません。したがって、何を検索する必要があるかについての本当の手がかりがありません。

私の質問は次のとおりです。そのような構造を作成し、すべてのvoid inject()メソッドを「すべて」のコンポーネントに自動的に追加するインターフェースを定義することは可能ですか? もしそうなら、どのようにそれを行うことができますか?

-- 編集 -- 予想される使用法は次のようになります。

public MyActivity extends Activity {
    private RestClient restClient;
    private SharedPreferences sharedPreferences;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        MyRestComponent.Instance.build().inject(this);
        MyPreferencesComponent.Instance.build().inject(this);
    }

    @Inject
    public void setRestClient(RestClient restClient){
        this.restClient = restClient;
    }

    @Inject
    public void setSharedPreferences(SharedPreferences sharedPreferences){
        this.sharedPreferences = sharedPreferences;
    }
}
4

1 に答える 1