2015-07-10 21 views
8

Có, tôi biết điều này đã được hỏi trước và có, tôi biết đó là "theo thiết kế".Dagger2: Thành phần không thể phụ thuộc vào nhiều thành phần phạm vi

Nhưng tôi muốn làm một cái gì đó như thế này:

@Component(modules = {RealmModule.class}) 
public interface RealmComponent { 
    Realm realm(); 
} 


@Component(modules = {RepositoryModule.class}) 
public interface RepositoryComponent { 
    PersonRepository personRepository(); 

    ScheduleRepository schedulesRepository(); 
} 

@Component(dependencies = {RealmComponent.class, RepositoryComponent.class}) 
public interface AppDataComponent 
     extends RealmComponent, RepositoryComponent { 
} 

@ApplicationScope 
@Component(dependencies = {AppContextComponent.class, 
     AppDataComponent.class, 
     AppDomainComponent.class, 
     AppPresentationComponent.class, 
     AppUtilsComponent.class}) 
public interface ApplicationComponent 
     extends AppContextComponent, AppDataComponent, AppDomainComponent, AppUtilsComponent, AppPresentationComponent { 
    void inject(CustomApplication customApplication); 

    void inject(DashboardActivity dashboardActivity); 
} 

Tuy nhiên, những gì tôi nhận được là unscoped, mỗi khi tôi tiêm một JobManager hoặc một ScheduleRepository hoặc bất cứ điều gì khác, tôi nhận được một mới dụ. Cách duy nhất tôi có thể "sửa chữa" đó là điều này.

@Module 
public class JobManagerModule { 
    private JobManager jobManager; 

    @Provides 
    public JobManager jobManager(Context context) { 
     if(jobManager == null) { 
      jobManager = new JobManager(context, new Configuration.Builder(context).networkUtil(
        new WifiOrMobileNetworkUtil(context)).build()); 
     } 
     return jobManager; 
    } 
} 

Không phải là người hâm mộ.

Vì vậy, làm thế nào là một nghĩa cấu trúc và rip ngoài cây phụ thuộc, mà không đã có một thành phần blob über khổng lồ lớn mà có mỗi mô-đun đơn niêm yết và mọi phương pháp cung cấp đơn (thay vì những "tiểu hợp phần "phụ thuộc thành phần)?

Tôi đã thử sử dụng các thành phần phụ cho điều này, nhưng sau đó bạn phải cung cấp mọi mô-đun duy nhất cho ApplicationComponent cuối cùng.

Tôi không biết phải làm gì ở đây. Tôi đã thử chỉ định @Singleton cho mọi thành phần cấp một và @SubcomponentScope cho mỗi AppDataLevelComponent, tôi cũng đã thử tạo một phạm vi mới cho từng thành phần phụ, nhưng cả hai đều không thành công với "không thể phụ thuộc vào nhiều thành phần phạm vi".

CHỈNH SỬA: Dường như để nhận nhà cung cấp phạm vi, đánh dấu các thành phần có phạm vi là không đủ - bạn cũng phải chỉ định phạm vi cho các phương pháp chú thích @Provides.

@Module 
public class RepositoryModule { 
    @Provides 
    @Singleton 
    public PersonRepository personRepository() { 
     return new PersonRepositoryImpl(); 
    } 

    @Provides 
    @Singleton 
    public ScheduleRepository schedulesRepository() { 
     return new SchedulesRepositoryImpl(); 
    } 
} 

Trong thời gian chờ đợi, tôi đã kết thúc với thành phần này.

@Singleton 
@Component(modules = { 
     AppContextModule.class, 
     DbMapperModule.class, 
     DbTaskModule.class, 
     RealmModule.class, 
     RepositoryModule.class, 
     InteractorModule.class, 
     ServiceModule.class, 
     PresenterModule.class, 
     XmlPersisterModule.class 
}) 
public interface ApplicationComponent 
     extends AppContextComponent, AppDataComponent, AppDomainComponent, AppUtilsComponent, AppPresentationComponent { 

Trường hợp xyzComponent lớp chỉ là giao diện để lưu trữ các phương pháp cung cấp ...

(Xin lưu ý rằngthis structure is an anti-pattern as described by Martin Fowler, and you should organize modules based on features/activities, và làm cho họ thành các thành phần subscoped sử dụng phụ thuộc thành phần. Phụ thuộc Hợp phần được sử dụng để subscope các thành phần siêu kính của bạn và "kế thừa" các nhà cung cấp phụ thuộc.)

Trả lời

2

Tôi đã gặp vấn đề tương tự như bạn trong khi trước và kết thúc bằng cách sử dụng cùng cách tiếp cận khác, ngoại trừ tôi sử dụng @Subcomponent n sắp xếp mọi thứ và không có tất cả các mô-đun được liệt kê trong phần ubercomponent (tôi gọi nó là thành phần "hàng đầu" hoặc "ứng dụng").

Bạn có thể xem ví dụ tại đây: How to migrate missing inject from module with complete = false from Dagger 1 to Dagger 2

Các vấn đề liên quan