Saltar al contenido

Inyectar solo ciertos parámetros en el constructor

Ten en cuenta que en las ciencias cualquier problema casi siempre tiene varias soluciones, pero enseñamos lo más óptimo y mejor.

Solución:

Hacer constructor de inyección con constructor secundario

class PhonePresenter(
    private val preference: DataPreference,
    private val ioScheduler: Scheduler)         
    @Inject constructor(preference: DataPreference) : this(preference, Schedulers.io())

Dagger es responsable de la inyección, deja que haga su trabajo. No uses parámetros predeterminados (a Dagger no le importa), esto te obligará a tomar decisiones conscientes sobre tus dependencias.

Dos enfoques vienen a la mente:

1. Usa Dagger para inyectar

Cree un calificador para que Dagger pueda diferenciar entre los tipos de programadores que podría querer inyectar y un módulo que proporcione un programador de IO predeterminado.

@Qualifier
@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.FIELD, AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER)
@MustBeDocumented
annotation class ForIo

@Module
class SchedulerModule 
     @Provides @ForIo
     fun provideIoScheduler() : Scheduler = Schedulers.io()


class PhonePresenter @Inject constructor(
    private val preference: DataPreference,
    @ForIo private val ioScheduler: Scheduler
)  ... 

Agregar SchedulerModule a su componente como de costumbre.

La forma correcta de proporcionar diferentes argumentos es usar un componente diferente con diferentes módulos especializados, por ejemplo, para pruebas. O cuando haga la prueba, llamará al constructor manualmente.

2. Evita Dagger en este caso

Alternativamente, puede eliminar el programador de IO de los parámetros del constructor. Los nombres sugieren que nunca va a ser otra cosa que Schedulers.io() por lo que tiene poco sentido parametrizarlo; conviértalo en un detalle de implementación en su lugar.

class PhonePresenter @Inject constructor(private val preference: DataPreference)  
    private val ioScheduler = Schedulers.io()

    ... 

Te mostramos las comentarios y valoraciones de los usuarios

No se te olvide difundir este ensayo si te valió la pena.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *