MVVM V El modelo (Model)
Siguiendo con esta serie de post sobre MVVM hoy vamos a hablar del modelo (Model), los modelos son los encargados de proveer la información a nuestros ViewModels es decir tienen la responsabilidad del acceso a datos y la lógica de negocios para que los ViewModels tengan la responsabilidad primordial de mostrar la información a través de la vista (View) y manejar la lógica de la aplicación.
En este punto y para apoyarnos me gustaría hacer una analogía en la que utilizaremos las funciones generales de un automóvil el cual representará nuestra aplicación (repito es una visión muy simple de un automóvil).
En este automóvil la vista (View) será representada por las puertas, el volante, los pedales y demás partes con que trabaja de forma directa el conductor (usuario).
Los ViewModels serían todos los engranes y demás sistemas que permiten que las acciones del conductor (usuario) dirijan al automóvil hacia donde el desea.
Por último tendríamos a los modelos (Models) que serían el motor de nuestro automóvil, el encargado de convertir el combustible (esperemos que en un futuro no muy lejano sea energía eléctrica :D) en energía motriz y con ello permitir al automóvil cumplir con su objetivo.
En el caso de nuestra aplicación es obvio que el combustible es la información que manejaremos para nuestros usuarios, ya que ese es el cometido de nuestras aplicaciones proveer y/o recibir información útil para el usuario.
En muchos casos se dan como ejemplo de modelo las entidades, pero en el modelo dentro del patrón MVVM también están incluidos las clases de acceso a datos y las de lógica de negocio.
En el siguiente ejemplo crearemos el modelo de un pequeño lector de RSS de este blog, como primer paso agregaremos las entidades que nos ayudarán para leer la información desde nuestro archivo XML, y una pequeña clase a la cual llamaremos RSSModel que será la encargada de descargar el contenido de nuestro RSS.
En este post solo incluiré la entidad rss que es la primera dentro del RSS como ejemplo, pero si lo deseas puedes descargar el RSS desde aquí y una vez que tengas acceso al XML puedes hacer uso del siguiente tip para obtener todas las clases de una manera sencilla.
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class rss
{
private rssChannel channelField;
private decimal versionField;
/// <remarks/>
public rssChannel channel
{
get
{
return this.channelField;
}
set
{
this.channelField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public decimal version
{
get
{
return this.versionField;
}
set
{
this.versionField = value;
}
}
}
La clase RSSModel se encarga como mencionamos anteriormente de descargar la información del RSS así como de deserializarla. Una vez que hemos deserializado la información haremos uso de eventos para retornar la información que hemos obtenido de forma asíncrona.
He dejado el método de descarga de información muy simple, pero tú puedes agregar el manejo de excepciones.
public class RSSModel
{
public EventHandler<OnRssDownloadEventArgs> OnRssDownloadCompleted { get; set; }
public async Task RssDownload()
{
try
{
string url = "https://saturninopimentel.com/rss";
using (HttpClient httpClient = new HttpClient())
{
var result = await httpClient.GetStreamAsync(url);
XmlSerializer serializer = new XmlSerializer(typeof(rss));
var rssResult = (rss)serializer.Deserialize(result);
if (OnRssDownloadCompleted != null)
{
OnRssDownloadCompleted(this, new MainEventArgs(rssResult));
}
}
}
catch (Exception)
{
}
}
}
Buenas prácticas
Para organizar tus archivos se recomienda generar una carpeta a nivel de proyecto donde coloques todos tus modelos. En lo personal prefiero generar una subcarpeta para las entidades pero tú puedes elegir la organización que más te convenga.
En el siguiente post hablaremos de los ViewModels para terminar de revisar los elementos principales del patrón y unirlos para crear una aplicación de ejemplo, si tienes alguna duda escribe en los comentarios :D. Saludos!!!