具有不同作用域的模块
问题描述:
如何创建一个具有注释的模块,如@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。
这显示错误。
答
如果您要创建不同的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
作为ApplicationComponent
的@Subcomponent
:
@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);
}
}
通知从@Module
注释和Context
与@ApplicationContext
创作注释去除:
JobManagerComponent jobComponent = DaggerApplicationComponent.builder()
.applicationModule(applicationModule)
.build()
.provide(new JobManagerModule());
这已解决了问题,但它在其他地方引发了冲突。我会发表另一个问题。 – Subby
我问过这个问题http://*.com/questions/40632408/two-injects-in-one-object-but-from-two-different-components – Subby
任何想法如何我可以将JobManager注入到MyObject以及来自不同组件的不同对象? – Subby