DEV Community

Cover image for How to map Nested Object mappings with AutoMapper C#
Matheus Paixão
Matheus Paixão

Posted on

11 1

How to map Nested Object mappings with AutoMapper C#

So let me start by saying that I decided to share this content because I just couldn't find the perfect answer on internet, it took me half a day to figure this out.

Gif

As a good practice, we are using the RequestDTO and a ResponseDTO, so we don't return the same model we receive.

RequestDTO

    public class Attributes
    {
        public string type { get; set; }
        public string url { get; set; }
    }

    public class Keep
    {
        public Attributes attributes { get; set; }
        public DateTime LastModifiedDate { get; set; }
        public string Email { get; set; }            
    }

    public class Discart
    {
        public Attributes attributes { get; set; }
        public DateTime LastModifiedDate { get; set; }
        public string Email { get; set; }

    }

    public class Root
    {            
        public List<DataWeNeed> Keep { get; set; }
        public List<DataWeDontNeed> Discart { get; set; }
        public string userId { get; set; }
    }
}
Enter fullscreen mode Exit fullscreen mode

ResponseDTO

    public class Attributes
    {
        public string type { get; set; }
        public string url { get; set; }
    }

    public class ResponseKeep
    {
        public Attributes attributes { get; set; }
        public DateTime LastModifiedDate { get; set; }
        public string Email { get; set; }            
    }
Enter fullscreen mode Exit fullscreen mode

AutoMapper Basic Configuration Startup.cs



 public void ConfigureServices(IServiceCollection services)
        {            
            services.AddAutoMapper(typeof(Startup));
        }


Enter fullscreen mode Exit fullscreen mode

Controller



public class Controller : ControllerBase
    {
//AutoMapper Dependency Injection
        private readonly IMapper _map;

        public ValuesController(IMapper map)
        {
            _map = map;
        }

        [HttpPost]
        [Route("api")]
        public Keep Post(Object value)
        {            
//Deserialize de Json request into our Object
            Root deserialized = JsonConvert.DeserializeObject<Root>(value.ToString());

//Mapping the first item of the Keep List into the responseDto
            var responseDTO = _map.Map<ResponseDTO>(deserealized.Keep.FirstOrDefault());

            return responseDTO;
        }
    }


Enter fullscreen mode Exit fullscreen mode

Mapping Profile

Here is where the magic happens.

To make sure the the automapper does the right mapping and doesn't returns an exception we must resolve the mapping in details.
How?

As we have different Objects, we need to tell automapper which objects and fields are mapped and from where, using the method ForMember and MapFrom.

See that the main Object the automapper does automatically without mapping the fields, but, when it comes to the Object Value Attributes I had to map one by one so it would understand where the information is sourced and where the information the designated.



public AutoMapper()
        {
            CreateMap<RequestDTO.Attributes, ResponseDTO.Attributes>()
                .ForMember(
                    dest => dest.type,
                    opt => opt.MapFrom(src => src.type)
                )
                .ForMember(
                    dest => dest.url,
                    opt => opt.MapFrom(src => src.url)
                );
            CreateMap<Keep, ResponseKeep>()
                .ForMember(
                dest => dest.attributes,
                opt => opt.MapFrom(src => src.attributes));
        }


Enter fullscreen mode Exit fullscreen mode

That's the solution I found to solve my issue, If you have another solution, specially that doesn't involve mapping field by field.

Obrigado

Hostinger image

Get n8n VPS hosting 3x cheaper than a cloud solution

Get fast, easy, secure n8n VPS hosting from $4.99/mo at Hostinger. Automate any workflow using a pre-installed n8n application and no-code customization.

Start now

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay