#dotNetSpain2015: Compartición Extrema de Código con C#

El pasado sábado 28 de febrero tuve el placer de participar en el mayor evento de .NET realizado en España: la dotNet Spain Conference. Allí impartí mi sesión de Compartición Extrema de Código con C# .

 

Esta sesión parte de la necesidad de realizar una app móvil que funcione en las principales plataformas del mercado: Windows, Windows Phone, iOS y Android, y de querer poder compartir todo el código posible entre ellas. Tradicionalmente desarrollar para varias plataformas puede resultar muy costoso y complicado, ya que tenemos que lidiar con diversos sistemas operativos, IDEs, plataformas de desarrollo y lenguajes de programación, y la compartición de código se suele limitar a la capa de servicios web si los hubiera.

image

 

Pero gracias a .NET y Xamarin podemos crear una app nativa con C# y Visual Studio que funcione en todas estas plataformas. Además, la mayor parte del código con la lógica de nuestra app podrá ser compartido entre todas ellas. Y a la vez podremos llamar a las APIs nativas de cada plataforma y mostrar un interfaz de usuario adaptado a cada una de ellas.

image

 

¡Incluso con Xamarin.Forms podremos llegar a compartir gran parte del código del interfaz de usuario!

 

Ahora, ya que podemos compartir código entre varias plataformas, ¿cuáles son los diferentes mecanismos que tenemos para hacerlo? ¿Y cómo podemos lidiar con el código que depende de cada plataforma (p.ej. llamadas a APIs nativas)?

Durante la sesión vimos cómo los diferentes tipos de Portable Class Libraries (PCLs) nos permiten compartir el código con la lógica de nuestra app de manera muy sencilla.

image

 

Aquí puedes encontrar más información: Librerías Portables: Comparte código entre múltiples plataformas.

También vimos cómo podemos lidiar con las diferencias entre plataformas gracias al uso de herencia con clases base abstractas y del polimorfismo mediante interfaces.

A continuación cubrimos otra manera de compartir código mediante proyectos compartidos para Universal Apps y proyectos compartidos de Xamarin.Forms como alternativa al enlazado de ficheros tradicional. En estos proyectos compartidos podemos compartir, además de lógica de aplicación, código de interfaz de usuario y llamadas a APIs. Y para lidiar con las diferencias entre plataformas cuando utilizamos este tipo de proyectos, vimos cómo podemos utilizar compilación condicional y clases parciales, además de los mecanismos de herencia y polimorfismo ya comentados para las PCLs.

 

Una vez que sabemos cómo podemos compartir el código y lidiar con las diferencias entre plataformas, ¿cómo podemos diseñar nuestro código de manera que la compartición y reutilización del mismo sea lo más sencilla posible?

Durante la sesión hablamos del patrón MVVM y de cómo es clave para llevar nuestros proyectos a buen puerto.

image

 

Y una vez que sabemos que tenemos que interiorizar el patrón MVVM y usarlo en nuestros proyectos, ¿qué partes de nuestra app podemos reutilizar y cuáles no? ¿Qué partes de nuestro código podemos poner en cada sitio? ¿Cómo hacemos que nuestra app almacene datos en el cloud para que el usuario pueda usarla independientemente del dispositivo que utilice? ¿Cómo podemos almacenar los datos del cloud en local para que la app funcione sin conexión a Internet? ¿Cómo lidiamos con las notificaciones Push en un entorno multiplataforma como este?

Para responder a estas y otras preguntas desarrollé una app de ejemplo basada en un paquete NuGet que creé para consumir la API de Marvel: AlejaCMa.MarvelAPI, cuyo código está disponible en GitHub y es multi-plataforma.

Esta app la creé como App Universal para Windows 8.1 y Windows Phone 8.1, y como app de Xamarin.Forms para Android y Windows Phone 8 (no incluí el proyecto de Xamarin.Forms para iOS al no disponer de un Mac para compilar el código, requisito indispensable al trabajar con esta plataforma).

image

 

Durante el resto de la sesión pudimos recorrer las partes principales de esta app de ejemplo y cubrimos los siguientes puntos:

  1. En general, cómo implementar el patrón MVVM (Modelo, Vista, Vista-Modelo).
  2. Cómo compartir nuestros Vista-Modelo.
  3. Cómo crear nuestras Vistas compartiendo su XAML o su código en los diferentes proyectos, y lidiando con las posibles diferencias en el interfaz de usuario para las diferentes plataformas.
  4. Cómo hacer que nuestras Vistas usen los Vista-Modelo compartidos mediante el uso de Service Locators y contenedores de Inyección de Dependencias como Unity.
  5. Cómo implementar Servicios para acceder a APIs particulares de cada plataforma y usarlos desde los Vista-Modelo compartidos.
  6. Cómo compartir nuestro Modelo de datos.
  7. Cómo acceder a la API de Marvel con peticiones web a su API REST y procesamiento del Json recibido, todo de manera compartida.
  8. Cómo convertir las entidades que recibo de la API de Marvel a las entidades que mi app necesita con Automapper, compartiendo todo el código.
  9. Cómo utilizar una base de datos SQLite para almacenar localmente los datos de la API de Marvel de manera que prácticamente todo el código de acceso a la base de datos sea compartido. Aquí puedes encontrar más información: Usando SQLite en desarrollos multiplataforma.
  10. Cómo crearnos un backend en pocos minutos con Azure Mobile Services para poder almacenar en una base de datos en el cloud nuestros personajes, cómics y creadores de cómics favoritos. Esta funcionalidad no está disponible en la API de Marvel, que es de sólo lectura.
  11. Cómo utilizar Mobile Services en nuestra app para poder almacenar los datos en el cloud y recuperarlos, y trabajar con esos datos de manera offline con SQLite, compartiendo todo el código.
  12. Cómo hacer que los usuarios tengan que hacer logon con su cuenta de twitter para poder guardar sus favoritos en Mobile Services, lidiando con las particularidades de cada plataforma a la hora de pedir y almacenar las credenciales del usuario.
  13. Cómo hacer que Mobile Services nos envíe notificaciones Push independientemente del dispositivo en el que estemos, y que cada plataforma sea capaz de recibirlas a su manera.

 

Y tras cubrir todos estos puntos pudimos comprobar cómo sí que es posible utilizar C# para compartir la mayor parte de nuestro código entre las diferentes plataformas, quedando la “foto” así para este ejemplo en particular:

image

 

En GitHub podrás encontrar todo el código de este ejemplo, tanto de la app como del backend:

ver-github1

 

Y aquí tienes la presentación de PowerPoint que utilicé durante la sesión, con información y enlaces de interés adicionales: Extreme Code Sharing with C#.

Por cierto, la sesión fue grabada, y la puedes ver aquí: Compartición Extrema de Código con C#.

 

Espero que te sea de utilidad.

Un saludo,

Alejandro Campos Magencio (@alejacma)

Technical Evangelist

PD: Mantente informado de todas las novedades de Microsoft para los desarrolladores españoles a través del Twitter de MSDN, el Facebook de MSDN, el Blog de MSDN y la Newsletter MSDN Flash.