AutoMapper y el uso de DTOs 🗺
Un DTO es un Objeto de Transferencia de Datos y es utilizado para encapsular datos y enviarlos de un sistema a otro.
En este ejemplo se hará uso de DTOs con el propósito de no exponer las clases utilizadas como Modelos de la base de datos directamente a la API. Adicionalmente se realizará una conversión automática de un tipo de datos a otro para el manejo de la imagen 😉.
DTOs para ProfilePicture
Se hará uso de anotaciones para indicar que algunos campos serán requeridos. Agrega la siguiente referencia.
using System.ComponentModel.DataAnnotations;
Implementaremos la conversión de tipos en Automapper debido a que la entidad y en la base de datos se almacenará la imagen como un arreglo de bytes, mientras que en el Web Service se utilizará un campo string para enviar o recibir la imagen codificada como Base64.
ProfilePictureEntry
public class ProfilePictureEntry
{
[Required]
public string Picture { get; set; }
}
ProfilePictureResult
public class ProfilePictureResult
{
public int Id { get; set; }
public string Picture { get; set; }
public DateTime CreatedDate { get; set; }
public DateTime ModifiedDate { get; set; }
}
Conversión de Tipos (ITypeConverter)
Para la conversión entre Base64 y un arreglo de bytes, se implementará la interfaz ITypeConverter y la función Convert. El parámetro source se utilizará para realizar la conversión respectiva y se retornará el resultado de la conversión como resultado de la función.
using AutoMapper;
using System.IO;
public class Base64TypeConverter : ITypeConverter<byte[], string>
{
public string Convert(byte[] source, string destination, ResolutionContext context)
{
using (MemoryStream m = new MemoryStream())
{
// Convert byte[] to Base64 String
string base64String = System.Convert.ToBase64String(source);
return base64String;
}
}
}
public class ByteArrayTypeConverter : ITypeConverter<string, byte[]>
{
public byte[] Convert(string source, byte[] destination, ResolutionContext context)
{
byte[] imageBytes = System.Convert.FromBase64String(source);
return imageBytes;
}
}
Perfil de Mapeo
Para crear el perfil de mapeo, se debe heredar de la clase AutoMapper.Profile y en el constructor indicarle a AutoMapper que utilice las clases TypeConverter para la conversión y los mapeos posibles entre los DTOS y las entidades.
public class MappingProfile : Profile
{
public MappingProfile()
{
CreateMap<string, byte[]>().ConvertUsing(new ByteArrayTypeConverter());
CreateMap<byte[], string>().ConvertUsing(new Base64TypeConverter());
CreateMap<Dtos.ProfilePictureEntry, Models.ProfilePicture>();
CreateMap<Models.ProfilePicture, Dtos.ProfilePictureResult>();
}
}
Registro de AutoMaper
En el archivo Startup.cs se debe agregar en el método la adición del Servicio AutoMaper. El servicio escanea las clases de AutoMapper y registra la configuración, mapeo y extensiones en la colección de servicios.
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<PictureToSQLDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
// otros servicios configurados
services.AddAutoMapper(typeof(Startup));
}
Deja una respuesta