Automapper les facilitará la vida cuando necesiten convertir objetos de diferente tipo pero con estructuras similares y les ahorrará muchas líneas de código.
Consideremos el siguiente código:
/// <summary>
/// Copy ArticleDoc to new ArticleModel.
/// </summary>
/// <param name="doc">Article to copy</param>
/// <returns>A new ArticleModel object</returns>
public static ArticleModel ArticleDocToModel(ArticleDoc doc)
{
if (doc == null)
return null;
// create model
ArticleModel model = new ArticleModel();
model.Id = doc.id.ToString();
model.Title = doc.title;
model.Introduction = doc.introduction;
model.Content = doc.content;
model.CreateDate = doc.createDate;
model.ChangeDate = doc.changeDate;
model.PubDate = doc.pubDate;
model.PubStatus = doc.pubStatus;
model.Categories = doc.categories;
model.TwoColumns = doc.twoColumns;
model.Favorite = doc.favorite;
if (doc.author != null)
{
model.AuthorName = doc.author.name;
model.AuthorTitle = doc.author.title;
}
if (doc.comments != null)
{
model.Comments = new List<CommentModel>();
doc.comments.ForEach(c => model.Comments.Add(CommentModelHelper.CommentObjToModel(c)));
}
return model;
}
El procedimiento anterior se utiliza para obtener un objeto de tipo ArticleModel que proviene de otro objeto similar pero de tipo ArticleDoc. Lo que se quería con esta función era convertir "documentos" provenientes de una base de datos de documentos (MongoDB) en objetos convenientes para nuestro modelo MVC.
Lo tedioso del asunto era hacer el mapeo de los atributos uno a uno, atributos con características similares, nombre y tipo. Así que un día decidí buscar una manera mas sencilla de hacer este trabajo y me tropecé con Automapper. Así que, sin mas preámbulos, veamos cómo funciona:
/// <summary>
/// GET: /Order/Details/5
/// </summary>
/// <param name="id">The order id.</param>
/// <returns>The ActionResult.</returns>
public ActionResult Details(int id)
{
var order = this.orderRepository.GetById(id);
Mapper.CreateMap<Order, OrderViewModel>();
var model = Mapper.Map<OrderViewModel>(order);
return this.View(model);
}
Ya no se necesita hacer el mapeo manual de los atributos. Ahora simplemente se le da la orden a Automapper de crear un nuevo objeto de tipo OrderViewModel y copiar los atributos similares que se encuentran en el objeto de tipo Order. Con esto nos hemos ahorrado una gran cantidad de líneas de código.
Automapper también ofrece la posibilidad de crear nuestros propios "resolvers" para que los mapeos actúen como nosotros deseamos, pero esto lo pueden investigar ustedes en la página de Automapper. Yo solo cumplo con informarles de que existe esta herramienta que es muy sencilla de utilizar y que les pudiera resultar muy útil en alguna ocasión.
