Gå til indholdet

Datamapping

Datamapping er processen med at overføre data fra et format eller et objekt til et andet. Det er en afgørende del af mange applikationer, især når data skal overføres mellem forskellige lag i en applikation, såsom fra en domænemodel til en datatransferobjekt (DTO) eller vice versa. Datamapping kan udføres manuelt eller ved hjælp af biblioteker, der automatiserer processen.

Manuel Datamapping

Manuel datamapping indebærer at skrive specifik kode for at kopiere data fra et objekt til et andet. Dette er ofte tidskrævende og fejlbehæftet, men giver fuld kontrol over, hvordan data mappes.

Forestil dig, at du har en Person-entitet og en PersonDTO. For at overføre data fra Person til PersonDTO, skal du manuelt kopiere hvert felt:

Person person = new Person()
{
    Id = 1,
    Name = "John Doe",
    Description = "A person",
    Address = "Some street 1",
    City = "Some city",
    Country = "Some country",
    Phone = "12345678",
    Email = "a@a.com"
};
PersonDTO PersonDTO = PersonDTO.MapPersonToDTO(person);

public class Person
{
    public int Id { get; init; }
    public string? Name { get; init; }
    public string? Description { get; init; }
    public string? Address { get; init; }
    public string? City { get; init; }
    public string? Country { get; init; }
    public string? Phone { get; init; }
    public string? Email { get; init; }

}

public class PersonDTO
{
    public string? Name { get; set; }
    public string? City { get; init; }    
    public string? Email { get; init; }


    public static PersonDTO MapPersonToDTO(Person person)
    {
        return new PersonDTO() 
        { 
            Name = person.Name, 
            City = person.City, 
            Email = person.Email 
        };

    }
}

Automatiseret Datamapping

Automatiseret datamapping reducerer behovet for manuel kode og minimerer risikoen for fejl. Biblioteker som AutoMapper og Mapster er populære værktøjer, der bruges til denne form for datamapping i .NET-applikationer.

AutoMapper

AutoMapper er et objekt-til-objekt mapper-værktøj, der automatisk mapper data mellem to forskellige typer. Det bruger konventioner til at bestemme, hvordan mappet skal foregå, og kan konfigureres til at imødekomme specifikke krav.

For at bruge AutoMapper skal du først tilføje NuGet-pakken AutoMapper og definere en mapping-konfiguration:

using AutoMapper;

var config = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<Person, PersonDTO>();
});
IMapper mapper = config.CreateMapper();

Person person = new Person()
{
    Id = 1,
    Name = "John Doe",
    Description = "A person",
    Address = "Some street 1",
    City = "Some city",
    Country = "Some country",
    Phone = "12345678",
    Email = "a@a.com"
};

PersonDTO dto = mapper.Map<PersonDTO>(person);


public class Person
{
    public int Id { get; init; }
    public string? Name { get; init; }
    public string? Description { get; init; }
    public string? Address { get; init; }
    public string? City { get; init; }
    public string? Country { get; init; }
    public string? Phone { get; init; }
    public string? Email { get; init; }

}

public class PersonDTO
{
    public string? Name { get; set; }
    public string? City { get; init; }    
    public string? Email { get; init; }

}

Se evt. Mapster som altertiv til AutoMapper.

Mapperly

Mapperly er et .NET bibliotek, der benytter source generators til at skabe type-safe og ydelseseffektive mappings mellem forskellige objekter. Source generators, introduceret i .NET 5, er en kraftfuld funktion i Roslyn-kompileren, som tillader generering af yderligere kildekode under kompileringstiden. Dette betyder, at Mapperly kan generere den nødvendige mappingkode automatisk, hvilket reducerer manuelt arbejde og muligheden for fejl.

Fordele ved Mapperly:

  1. Ydeevne: Da Mapperly genererer kode under kompilering, er der ingen runtime-overhead som ved traditionelle mappingbiblioteker. Dette kan føre til betydelige ydelsesforbedringer.

  2. Type-sikkerhed: Mapperly genererer type-safe kode, hvilket betyder, at mange fejl kan fanges under kompilering frem for ved runtime.

  3. Automatisering: Mapperly fjerner behovet for manuelt at skrive og vedligeholde mappinglogik, hvilket kan være både tidskrævende og fejlbehæftet.

For at bruge Mapperly skal du først installere det via NuGet (Riok.Mapperly) og derefter oprette dine mappingregler. Mapperly bruger attributter til at definere, hvordan mapping skal foregå.

Her er et super simpelt eksempel på en mapping mellem en Person-entitet og en PersonDTO:

using Riok.Mapperly.Abstractions;

Person person = new Person()
{
    Id = 1,
    Name = "John Doe",
    Description = "A person",
    Address = "Some street 1",
    City = "Some city",
    Country = "Some country",
    Phone = "12345678",
    Email = "a@a.com"
};

var mapper = new PersonMapper();
PersonDTO PersonDTO = mapper.PersonToPersonDto(person);

public class Person
{
    public int Id { get; init; }
    public string? Name { get; init; }
    public string? Description { get; init; }
    public string? Address { get; init; }
    public string? City { get; init; }
    public string? Country { get; init; }
    public string? Phone { get; init; }
    public string? Email { get; init; }

}

public class PersonDTO
{
    public string? Name { get; set; }
    public string? City { get; init; }    
    public string? Email { get; init; }

}

[Mapper]
public partial class PersonMapper
{
    public partial PersonDTO PersonToPersonDto(Person person);
}

Mapperly tilbyder en moderne og effektiv tilgang til datamapping i .NET-applikationer, udnytter fordelene ved source generators, og giver udviklere et værktøj til at skabe ydelseseffektive, type-safe og vedligeholdelsesvenlige mappings. Dette kan være særligt nyttigt i større projekter eller i systemer, hvor ydeevne og type-sikkerhed er af høj prioritet.