具有不同作用域的模块

问题描述:

如何创建一个具有注释的模块,如@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必须提供JobManagerComponentContext设有@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()); 
+0

这已解决了问题,但它在其他地方引发了冲突。我会发表另一个问题。 – Subby

+0

我问过这个问题http://*.com/questions/40632408/two-injects-in-one-object-but-from-two-different-components – Subby

+0

任何想法如何我可以将JobManager注入到MyObject以及来自不同组件的不同对象? – Subby