He estado leyendo mucho sobre el patrón singleton y cómo es "malo" porque hace que las clases lo usen difícil de probar, por lo que debe evitarse. He leído algunos artículos que explican cómo se puede reemplazar el singleton con inyección de dependencia, pero me parece innecesariamente complejo.
Aquí está mi problema con un poco más de detalle. Estoy creando una aplicación móvil usando React Native y quiero hacer un cliente REST que se comunique con el servidor, obtenga datos, publique datos y maneje el inicio de sesión (almacene el token de inicio de sesión y envíelo con cada solicitud después de iniciar sesión).
Mi plan inicial era crear un objeto singleton (RESTClient) que mi aplicación usará inicialmente para iniciar sesión y luego hacer una solicitud enviando las credenciales donde sea necesario. El enfoque DI me parece realmente complicado (tal vez porque nunca usé DI antes) pero estoy usando este proyecto para aprender tanto como pueda, así que quiero hacer lo mejor aquí. Cualquier sugerencia y comentario son muy apreciados.
Editar: ahora me di cuenta de que había formulado mal mi pregunta. Quería alguna guía sobre cómo evitar el patrón singleton en RN y debería incluso hacerlo. Afortunadamente, Samuel me dio el tipo de respuesta que quería. Mi problema era que quería evitar el patrón singleton y usar DI, pero parecía realmente complicado implementarlo en React Native. Investigué un poco más y lo implementé usando el sistema de contexto Reacts.
Para cualquier persona interesada, así es como lo hice. Como dije, utilicé el contexto en RN, que es algo así como accesorios, pero se propaga a cada componente.
En el componente raíz proporciono las dependencias necesarias como esta:
export default class Root extends Component {
getChildContext() {
restClient: new MyRestClient();
}
render() {...}
}
Root.childContextTypes = {restClient: PropTypes.object};
Ahora restClient está disponible en todos los componentes debajo de Root. Puedo acceder así.
export default class Child extends Component {
useRestClient() {
this.context.restClient.getData(...);
}
render() {...}
}
Child.contextTypes = {restClient: PropTypes.object}
Esto efectivamente aleja la creación de objetos de la lógica y desacopla la implementación del cliente REST de mis componentes.