Кинжал - инъекция зависимости

Является ли это решение правильным или я должен создать отдельные 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()
Другие вопросы по тегам