2016-11-16 2 views
1

Как создать модуль, который имеет аннотацию, например @UserScope, в зависимости от другого модуля, который является @Singleton?Модули с различными областями

@Module(includes = {ApplicationModule.class}) 
public class JobManagerModule 
{ 
    private static final String TAG = JobManagerModule.class.getSimpleName(); 

    @UserScope 
    @Provides 
    public JobManager providesJobManager(final Context context) 
    { 
     Log.d(TAG, "Providing JobManager"); 
     final Configuration configuration = new Configuration.Builder(context).build(); 
     return new JobManager(configuration); 
    } 
} 

Здесь JobManagerModule обеспечивает с помощью @UserScope но ApplicationModule обеспечивает объект контекста (который нуждается в JobManagerModule) в качестве @Singleton.

Показаны ошибки.

ответ

3

Если вы хотите создать другое Scope, то этот объем должен быть подкомпонентом @Singleton.

Предположим, у вас есть ApplicationComponent аннотированный с @Singleton:

@Singleton 
@Component(
     modules = ApplicationModule.class 
) 
public interface ApplicationComponent { 

    JobManagerComponent provide(JobManagerModule jobManagerModule); 
} 

ApplicationModule обеспечивает Context:

@Module 
public class ApplicationModule { 
    protected final Application mApplication; 

    public ApplicationModule(Application application) { 
     mApplication = application; 
    } 

    @Provides 
    @ApplicationContext 
    public Context provideApplicationContext() { 
     return mApplication; 
    } 
} 

Обратите внимание, что ApplicationComponent должен предоставить JobManagerComponent и Context снабжен @ApplicationContext аннотацию.

Теперь вы создаете JobManagerComponent как @Subcomponent из ApplicationComponent:

@UserScope 
@Subcomponent(
     modules = JobManagerModule.class 
) 
public interface JobManagerComponent{ 
} 

JobManagerModule:

@Module 
public class JobManagerModule 
{ 
    private static final String TAG = JobManagerModule.class.getSimpleName(); 

    @UserScope 
    @Provides 
    public JobManager providesJobManager(@ApplicationContext Context context) 
    { 
     Log.d(TAG, "Providing JobManager"); 
     final Configuration configuration = new Configuration.Builder(context).build(); 
     return new JobManager(configuration); 
    } 
} 

Обратите внимание на удаление include из @Module аннотацию и Context аннотацию @ApplicationContext

Создание JobManagerComponent:

JobManagerComponent jobComponent = DaggerApplicationComponent.builder() 
    .applicationModule(applicationModule) 
    .build() 
    .provide(new JobManagerModule()); 
+0

Это решило проблему, но это вызвало конфликт в другом месте. Я отправлю еще один вопрос. – Subby

+0

Я задал вопрос http://stackoverflow.com/questions/40632408/two-injects-in-one-object-but-from-two-different-components – Subby

+0

Любая идея, как я могу вставлять JobManager в MyObject вместе с другим объектом из другого компонента? – Subby

Смежные вопросы