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.)