2016-11-16 44 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必須提供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://stackoverflow.com/questions/40632408/two-injects-in-one-object-but-from-two-different-components – Subby

+0

任何想法如何我可以將JobManager注入到MyObject以及來自不同組件的不同對象? – Subby

相關問題