API Rest para almacenar imagen en base de datos con Entity Framework

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));
}

1 comentario

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios .