martes, 1 de octubre de 2019

MVVM con SQLite: modelo de solución

Cuando implementar algún patrón de diseño o un arquitectura que requiere cierta concentración y aprendizaje de mi parte, me gusta documentar el proceso para tenerlo como referencia en el futuro, y también para compartirlo con otros que quieran transitar el mismo camino.

En este caso, se trata de cómo apliqué el patrón Model-View-ViewModel junto con persistencia de datos SQLite, en mi aplicación móvil desarrollada con Xamarin Forms.

Me limitaré a enumerar lo pasos a alto nivel del proceso, que queda ilustrado en el diagrama de clases que acompaña el artículo. Cabe aclarar, que el diagrama sólo refleja aquellos atributos y comportamientos del modelo de clases que considero relevantes para la explicación, porque, claramente, el modelo completo es mucho más extenso.

Por un lado agregué una clase ExtendedBindableObject, que deriva de BindableObject, y agrega la notificación automática del evento PropertyChanged, cuando un ViewModel sufre algún cambio en sus propiedades expuestas.

De la clase ExtendedBindableObject, deriva BaseViewModel, que servirá de base para todas los ViewModels de cada objeto a representar.

El esquema de ViewModels en mi caso, hablando por ahora para objetos simples, consta de un ViewModel con una colección de objetos, otro para agregar nuevos objetos, y otro más para mostrar los detalles de un objeto dado, que además permite borrar o modificar sus atributos.

Para cada uno de los ViewModels detallados anteriormente, se corresponde un View, implementado dentro del modelo de Xamarin Forms como un ContentPage.

Al momento de crearse el View, se llama al constructor del ViewModel correspondiente, y se le pasa una nueva instancia del servicio CrudService (que implementa la interfaz ICrudService), que el ViewModel contiene. De este modo, se hace uso del patrón de inyección de dependencias (un caso particular del patrón inversión de control) indicando al ViewModel qué servicio utilizar para acceder a la capa de datos.

El servicio CrudService a su vez, se encarga de hacer las llamadas a la capa de datos, representada por la clase AppDatabase.

Esto es a grandes rasgos el cuadro completo necesario para implementar MVVM junto con SQLite. Tuve que invertir varias horas de lectura, y luego de pruebas, hasta dejarlo funcionando, pero me deja conforme estar alineado con las prácticas recomendadas.

Si se cumple luego la promesa de escalabilidad y crecimiento más limpio de la aplicación, que este patrón propone, el tiempo dirá.


No hay comentarios:

Publicar un comentario