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.

Spørgsmål til AI

For at få mest muligt ud af AI-værktøjer som ChatGPT, er det vigtigt at stille klare og præcise spørgsmål (og skabe det rigtige kontekst - se her). Her er nogle grundlæggende spørgsmål til denne side:

Grundlæggende spørgsmål til AI

  • Hvad er datamapping og hvorfor er det vigtigt i C# applikationer?
  • Hvad er forskellen mellem manuel og automatiseret datamapping?
  • Hvornår skal jeg bruge datamapping mellem objekter?
  • Hvad er en DTO (Data Transfer Object) og hvordan bruges den med mapping?
  • Hvordan implementerer jeg manuel datamapping mellem to klasser?
  • Hvad er fordele og ulemper ved manuel datamapping?
  • Hvilke biblioteker findes der til automatiseret datamapping i .NET?
  • Hvordan installerer og konfigurerer jeg AutoMapper i mit projekt?
  • Hvordan bruger jeg AutoMapper til at mappe mellem Person og PersonDTO?
  • Hvad er Mapster og hvordan adskiller det sig fra AutoMapper?
  • Hvad er Mapperly og hvorfor bruger det source generators?
  • Hvad er fordelene ved at bruge Mapperly frem for andre mapping biblioteker?
  • Hvordan opretter jeg en mapper klasse med Mapperly attributter?
  • Hvad betyder det at Mapperly er type-safe og hvorfor er det vigtigt?
  • Hvordan påvirker source generators ydeevnen af mapping operationer?
  • Hvornår skal jeg vælge AutoMapper vs. Mapperly vs. manuel mapping?
  • Hvordan håndterer jeg komplekse mapping scenarier med nested objekter?
  • Hvordan kan jeg teste mine mapping operationer for at sikre korrekthed?
  • Hvad er best practices for datamapping i større C# projekter?
  • Hvordan integrerer jeg datamapping i forskellige applikationslag?