web-dev-qa-db-ja.com

Dagger 2を使用して、複数のコンポーネントを使用して同じオブジェクトに注入するにはどうすればよいですか?

そのため、フラグメントとプレゼンターにシングルトンを挿入するためのApplicationComponentがありますが、AppComponentと同じプレゼンターに挿入するコンポーネントを作成しようとしています。これらの線に沿った何か。

@Component{modules = FileManagerModule.class}
public interface FileManagerComponet
{
    public void inject(MyPresenter presenter);
}

@Component{modules = AppModule.class}
public interface AppComponent
{
    public void inject(MyPresenter presenter);
}

@Module
public class AppModule
{
    private Context appContext;
    @Provides
    @Singleton
    public SharedPreferences preferences()
    {
        return appContext.sharedPreferences();
    }
    ...
}

@Module
public class FileManagerModule
{
    private Context activityContext;
    @Provides
    public FileManager FileManager()
    {
        return new FileManager(activityContext);
    }
    ...
}
12
Stampede10343

これを理解できない人には、1つのコンポーネントがオブジェクトへのすべての依存関係を提供する必要があります。したがって、私の場合、FileManagerComponentをサブコンポーネントにしてAppComponentで「.plus()」にするか、AppComponentに依存させて、AppComponentにContext context();それに依存するコンポーネントが、それが持つコンテキストにアクセスできるようにするメソッド。

例えば:

@Singleton
@Component(modules = {NetworkModule.class, AndroidModule.class})
public interface ApplicationComponent {
    FileManagerComponent plus(FileManagerModule module);
}

@Subcomponent(modules = {FileManagerModule.class})
public interface FileManagerComponent {
    void injectMyActivity(MyFileManagingActivity activity);
}

そして、あなたはそれをこのように使うでしょう(MyFileManagingActivityで):

FileManagerComponent fmc = applicationComponent.plus(new FileManagerModule());
fmc.injectMyActivity(this);

または、次のようなサブコンポーネントを使用したくない場合:

@Singleton
@Component(modules = {NetworkModule.class, AndroidModule.class})
public interface ApplicationComponent {
    Context context();
    File applicationRootDirectory();
}

// Notice this is ALSO a Component
@Component(modules = {FileManagerModule.class}, dependencies = ApplicationComponent.class)
public interface FileManagerComponent {
    void inject(MyFileManagerActivity activity);
}

次に、アプリコンポーネントに依存するコンポーネントを構築する必要があります。

FileManagerComponent fmc = DaggerFileManagerComponent.builder()
                   .applicationComponent(appComponent)
                   .fileManagerModule(new FileManagerModule())
                   .build();
fmc.inject(this);
13
Stampede10343