Кинжал - инъекция зависимости
Является ли это решение правильным или я должен создать отдельные FragmentBuildersModules для каждой Активности?
@Suppress("unused")
@Module
abstract class ActivityModule {
@ContributesAndroidInjector(modules = [FragmentBuildersModule::class])
abstract fun contributeMainActivity(): MainActivity
@ContributesAndroidInjector(modules = [FragmentBuildersModule::class])
abstract fun contributeLoginActivity(): LoginActivity
}
2 ответа
Если действия не используют одни и те же фрагменты, они должны зависеть от разных модулей фрагментов. Есть несколько разных причин для этого:
1) Вы придерживаетесь принципа единой ответственности SOLID;
2) Ваш код остается легким для чтения и повторного использования (например: если вам нужно только повторно использовать одно из действий в другом проекте, вы можете легко перенести его вместе с графиком его зависимостей);
3) Ваш код легче поддерживать (например: если кто-то будет использовать ваш код в будущем, он сразу узнает, какие фрагменты принадлежат каким действиям);
4) Ваш код менее подвержен ошибкам (например: если вы каким-то образом запутаете свой модуль фрагментов, это повлияет только на одно действие);
5) Вероятно, другие причины, которые я не могу вспомнить прямо сейчас:)
Поэтому было бы лучше, если бы вы создали отдельный модуль для вашей деятельности и фрагментов, а затем включили его для общего модуля. Screen module
(он должен состоять из всех ваших модулей экрана)
@Module(includes = [
AndroidInjectionModule::class,
RegistrationModule::class,
SecondaryModule::class,
BaseFontActivityModule::class,
SurveyModule::class,
SplashModule::class])
interface ScreenModule {
@Binds
fun bindViewModelFactory(factory: ViewModelFactory): ViewModelProvider.Factory
}
Модуль деятельности:
@Module
interface BaseFontFragmentModule {
@ContributesAndroidInjector(modules = [])
fun inject(): BaseFontFragment
}
@Module
interface BaseFontActivityModule{
@ContributesAndroidInjector(modules = [
BaseFontFragmentModule::class
])
fun inject(): BaseFontActivity
}
И модуль экрана, включенный в AppModule:
interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
fun application(app: Application): Builder
fun build(): AppComponent
}
fun inject(app: App)
}
@Module(
includes = [
RetroiftModule::class,
RegistrationModule::class,
ScreenModule::class
]
)
class AppModule {
@Provides
fun context(app: Application) = app.applicationContext!!
@Provides
fun sharedPreferences(app: Application) = app.getPreferences()