viernes, 10 de enero de 2014

Controlando el estado de la red usando MVVM

Bueno, continuamos con nuestras labores de infraestructura, que bien podrían parecer muchas pero que a la vez nos dan la seguridad de construir sobre bases firmes. Recuerden que este post hace parte de la serie CongresoVisible.

El nuevo reto al que nos enfrentamos es un requerimiento típico de usuarios y clientes que piden aplicaciones, controlar que no se hagan solicitudes cuando el internet no esté disponible. Pues bien, si ya lo han intentado, se habrán dado cuenta que comprobar que el internet este habilitado antes de cada petición es bastante costoso, y bueno vamos a intentar una forma más elegante de hacerlo y además de incluirlo en nuestro proyecto.

Lo primero con lo que nos encontramos es que, el comprobar el estado de la red es particular a cada plataforma como lo fue la navegación que vimos en el post anterior. Así que, aunque tenemos la interfaz de nuestro servicio en el proyecto de contratos. El contrato hasta el momento se ve así:

Su proposito va a ser exponer una propiedad que nos diga el estado de la red y además exponer un método que nos comunique el estado de la red en el momento que esta cambie.

Bien, luego de eso y aprovechando que tenemos una interfaz compartirda en las view model que cumple con un proposito similar, agregamos una propiedad nueva, el NetworkMonitor, a través del cual accederemos al Internet Services a verificar el estado de la conexión desde cualquiera de las vistas modelo.

Cómo es de esperarse este NetworkMonitor será implementado por la clase que comparten todas nuestras view models, es decir BindableBase.


Ahora bien, como ya lo había mencionado, al tener que enfrentar este problema como algo puntual de cada plataforma, ubicaremos la implementación del servicio en nuestra carpeta local de infraestructura.


La implementación será la siguiente:


Esta es la clase que debemos implementar en cada plataforma. Si observan bien, lo que en realidad sucede es que al interior del servicio estamos suscritos a la clase de Windows Phone que nos comunica los cambios en el estado de la conexión. Cuando esto ocurre hacemos dos cosas, verificamos el estado de la red y cambiamos la variable de control, pero además si alguien está escuchando el evento que expuso nuestra interfaz entonces le comunicaremos que el estado de la red cambió.

Algo más que debemos tener en cuenta es que para que nuestras vistas modelo que necesiten conexión a internet tengan el NetworkMonitor disponible, debemos asígnarlo en el constructor del Locator quien ya sabemos al estar como recurso de la aplicación estará vivo desde el inicio.


Actualización: En post siguientes al intentar ensamblar la aplicación se identificó un faltante en este punto y es la inicialización la primera vez que se inicia el localor. La clase quedó así.


En la inicialización simplemente se llama el método que establece los valores de las variables.


Este lo hacemos a modo de ejemplo, puesto que como estamos haciendo TDD aprovecharemos este post para hacer los Test de conectividad de nuestra aplicación. Primero preparamos la Vista Modelo que vamos a probar con un método que solo va a usar el servicio de consumo de datos si la red está disponible. Algo sencillo como pueden ver:


El GetFilters del FakeJsonService recuerden no es más que un llamado al Callback


Luego de eso construimos los Test de conectividad


Si hacen debug a estos test notarán como en el primero de ellos, jamás se pasa por el Breakpoint, lo que es lógico, debido a que al no haber conexión a internet no se usa el servicio de consumo de datos que es lo que queriamos. Mientras que en el segundo test claramente el debug entrará al Callback por que la red está disponible.

No olviden, todo este código es un tanto confuso pero está disponible en mi Github para que lo vean con calma y por que no, me envíen sus sugerencias y correcciones.

No hay comentarios: