Mappa inversa di AutoMapper in C#

Mappa inversa di AutoMapper in C#

AutoMapper ReverseMap in C# con esempi

In questo articolo parlerò dell'AutoMapper ReverseMap in C# con alcuni esempi. Si prega di leggere il nostro articolo precedente prima di passare a questo articolo in cui abbiamo discusso di come mappare il tipo complesso al tipo primitivo utilizzando AutoMapper in C# con esempi. Questo è uno dei concetti più importanti da comprendere in AutoMapper e alla fine di questo articolo capirai come funziona la mappatura inversa di automapper in c#.

Che cos'è la mappatura inversa di AutoMapper in C#?

La mappatura inversa di Automapper non è altro che la mappatura a due vie che è anche chiamata mappatura bidirezionale.

A partire da ora, la mappatura di cui abbiamo discusso è un mezzo direzionale se abbiamo due tipi, diciamo Tipo A e Tipo B, quindi mappamo il tipo A con il tipo B. Ma usando Automapper Mappatura inversa è anche possibile mappare il tipo B con il tipo A.

Comprendiamo C# AutoMapper Mappatura inversa con un esempio.

Utilizzeremo le seguenti tre classi per questa demo.

Per implementare la mappatura inversa utilizzando Automapper in C# dobbiamo utilizzare la ReverseMap opzione come mostrato nell'immagine qui sotto.

Di seguito è riportato l'esempio completo.

Il codice si spiega da sé. Quindi, per favore, passa attraverso le righe dei commenti.

using System;
using AutoMapper;
namespace AutoMapperDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            //Step1: Initialize the Mapper
            var mapper = InitializeAutomapper();

            //Step2: Create the Order Request
            var OrderRequest = CreateOrderRequest();

            //Step3: Map the OrderRequest object to Order DTO
            var orderDTOData = mapper.Map<Order, OrderDTO>(OrderRequest);

            //Step4: Print the OrderDTO Data
            Console.WriteLine("After Mapping - OrderDTO Data");
            Console.WriteLine("OrderId : " + orderDTOData.OrderId);
            Console.WriteLine("NumberOfItems : " + orderDTOData.NumberOfItems);
            Console.WriteLine("TotalAmount : " + orderDTOData.TotalAmount);
            Console.WriteLine("CustomerId : " + orderDTOData.CustomerId);
            Console.WriteLine("Name : " + orderDTOData.Name);
            Console.WriteLine("Postcode : " + orderDTOData.Postcode);
            Console.WriteLine("MobileNo : " + orderDTOData.MobileNo);
            Console.WriteLine();

            //Step5: modify the OrderDTO data
            orderDTOData.OrderId = 10;
            orderDTOData.NumberOfItems = 20;
            orderDTOData.TotalAmount = 2000;
            orderDTOData.CustomerId = 5;
            orderDTOData.Name = "Smith";
            orderDTOData.Postcode = "12345";

            //Step6: Reverse Map
            mapper.Map(orderDTOData, OrderRequest);

            //Step7: Print the Order Data
            Console.WriteLine("After Reverse Mapping - Order Data");
            Console.WriteLine("OrderNo : " + OrderRequest.OrderNo);
            Console.WriteLine("NumberOfItems : " + OrderRequest.NumberOfItems);
            Console.WriteLine("TotalAmount : " + OrderRequest.TotalAmount);
            Console.WriteLine("CustomerId : " + OrderRequest.Customer.CustomerID);
            Console.WriteLine("FullName : " + OrderRequest.Customer.FullName);
            Console.WriteLine("Postcode : " + OrderRequest.Customer.Postcode);
            Console.WriteLine("ContactNo : " + OrderRequest.Customer.ContactNo);
            Console.ReadLine();
        }

        private static Order CreateOrderRequest()
        {
            return new Order
            {
                OrderNo = 101,
                NumberOfItems = 3,
                TotalAmount = 1000,
                Customer = new Customer()
                {
                    CustomerID = 777,
                    FullName = "James Smith",
                    Postcode = "755019",
                    ContactNo = "1234567890"
                },
            };
        }

        static Mapper InitializeAutomapper()
        {

            var config = new MapperConfiguration(cfg => {
                cfg.CreateMap<Order, OrderDTO>()
                    //OrderId is different so map them using For Member
                    .ForMember(dest => dest.OrderId, act => act.MapFrom(src => src.OrderNo))

                    //Customer is a Complex type, so Map Customer to Simple type using For Member
                    .ForMember(dest => dest.Name, act => act.MapFrom(src => src.Customer.FullName))
                    .ForMember(dest => dest.Postcode, act => act.MapFrom(src => src.Customer.Postcode))
                    .ForMember(dest => dest.MobileNo, act => act.MapFrom(src => src.Customer.ContactNo))
                    .ForMember(dest => dest.CustomerId, act => act.MapFrom(src => src.Customer.CustomerID))
                    .ReverseMap();
            });
            
            var mapper = new Mapper(config);
            return mapper;
        }
    }

    public class Order
    {
        public int OrderNo { get; set; }
        public int NumberOfItems { get; set; }
        public int TotalAmount { get; set; }
        public Customer Customer { get; set; }
    }
    public class Customer
    {
        public int CustomerID { get; set; }
        public string FullName { get; set; }
        public string Postcode { get; set; }
        public string ContactNo { get; set; }
    }
    public class OrderDTO
    {
        public int OrderId { get; set; }
        public int NumberOfItems { get; set; }
        public int TotalAmount { get; set; }
        public int CustomerId { get; set; }
        public string Name { get; set; }
        public string Postcode { get; set; }
        public string MobileNo { get; set; }
    }
}

Quando esegui l'applicazione, mostra i dati come previsto, come mostrato nell'immagine sottostante.

Modifica dei modelli:

Modifichiamo i modelli come mostrato di seguito. Come puoi vedere nell'immagine sottostante, ora la proprietà di tipo complesso è presente in OrderDTO i tipi di classe e primitivi sono presenti nell'Ordine classe.

Implementiamo l'AutoMapper ReverseMap() funzione e vedere se otteniamo i risultati come previsto o meno. Modifica l'inizializzazione del mappatore per implementare la mappatura e la mappatura inversa per i tipi precedenti come mostrato nell'immagine sottostante.

Di seguito è riportato il codice per l'esempio completo
using System;
using AutoMapper;
namespace AutoMapperDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            //Step1: Initialize the Mapper
            var mapper = InitializeAutomapper();

            //Step2: Create the Order Request
            var OrderRequest = CreateOrderRequest();

            //Step3: Map the OrderRequest object to Order DTO
            var orderDTOData = mapper.Map<Order, OrderDTO>(OrderRequest);

            //Step4: Print the OrderDTO Data
            Console.WriteLine("After Mapping - OrderDTO Data");
            Console.WriteLine("OrderId : " + orderDTOData.OrderId);
            Console.WriteLine("NumberOfItems : " + orderDTOData.NumberOfItems);
            Console.WriteLine("TotalAmount : " + orderDTOData.TotalAmount);
            Console.WriteLine("CustomerId : " + orderDTOData.customer.CustomerID);
            Console.WriteLine("FullName : " + orderDTOData.customer.FullName);
            Console.WriteLine("Postcode : " + orderDTOData.customer.Postcode);
            Console.WriteLine("ContactNo : " + orderDTOData.customer.ContactNo);
            Console.WriteLine();

            //Step5: modify the OrderDTO data
            orderDTOData.OrderId = 10;
            orderDTOData.NumberOfItems = 20;
            orderDTOData.TotalAmount = 2000;
            orderDTOData.customer.CustomerID = 5;
            orderDTOData.customer.FullName = "James Smith";
            orderDTOData.customer.Postcode = "12345";

            //Step6: Reverse Map
            mapper.Map(orderDTOData, OrderRequest);

            //Step7: Print the Order Data
            Console.WriteLine("After Reverse Mapping - Order Data");
            Console.WriteLine("OrderNo : " + OrderRequest.OrderNo);
            Console.WriteLine("NumberOfItems : " + OrderRequest.NumberOfItems);
            Console.WriteLine("TotalAmount : " + OrderRequest.TotalAmount);
            Console.WriteLine("CustomerId : " + OrderRequest.CustomerId);
            Console.WriteLine("Name : " + OrderRequest.Name);
            Console.WriteLine("Postcode : " + OrderRequest.Postcode);
            Console.WriteLine("MobileNo : " + OrderRequest.MobileNo);
            Console.ReadLine();
        }

        private static Order CreateOrderRequest()
        {
            return new Order
            {
                OrderNo = 101,
                NumberOfItems = 3,
                TotalAmount = 1000,
                CustomerId = 777,
                Name = "James Smith",
                Postcode = "755019",
                MobileNo = "1234567890"
            };
        }

        static Mapper InitializeAutomapper()
        {

            var config = new MapperConfiguration(cfg => {
                cfg.CreateMap<Order, OrderDTO>()
                    .ForMember(dest => dest.OrderId, act => act.MapFrom(src => src.OrderNo))
                    .ForMember(dest => dest.customer, act => act.MapFrom(src => new Customer()
                    {
                        CustomerID = src.CustomerId,
                        FullName = src.Name,
                        Postcode = src.Postcode,
                        ContactNo = src.MobileNo
                    }))
                    .ReverseMap();
            });
            
            var mapper = new Mapper(config);
            return mapper;
        }
    }

    public class Order
    {
        public int OrderNo { get; set; }
        public int NumberOfItems { get; set; }
        public int TotalAmount { get; set; }
        public int CustomerId { get; set; }
        public string Name { get; set; }
        public string Postcode { get; set; }
        public string MobileNo { get; set; }
    }
    public class Customer
    {
        public int CustomerID { get; set; }
        public string FullName { get; set; }
        public string Postcode { get; set; }
        public string ContactNo { get; set; }
    }
    public class OrderDTO
    {
        public int OrderId { get; set; }
        public int NumberOfItems { get; set; }
        public int TotalAmount { get; set; }
        public Customer customer { get; set; }
    }
}

Ora esegui l'applicazione e guarda l'output.

Come puoi vedere dall'output sopra, la mappatura inversa di automapper funziona come previsto per i tipi primitivi ma non funziona per il tipo complesso.

Quindi, quando entrambe le classi hanno membri che hanno lo stesso nome, allora AutoMapper ReverseMap() la funzione funziona come previsto. Ma se le classi contengono membri diversi e non mappati tramite il mapping predefinito (per denominazione), questo non funziona come previsto.

Come far funzionare le due mappature come previsto?

Se vuoi che la mappatura a due vie funzioni come previsto, devi eseguire la mappatura tramite ForMember. Quindi modifica l'inizializzazione del Mapper per indicare la mappatura per il tipo complesso come mostrato nell'immagine sottostante.

Di seguito è riportato il codice completo.
using System;
using AutoMapper;
namespace AutoMapperDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            //Step1: Initialize the Mapper
            var mapper = InitializeAutomapper();

            //Step2: Create the Order Request
            var OrderRequest = CreateOrderRequest();

            //Step3: Map the OrderRequest object to Order DTO
            var orderDTOData = mapper.Map<Order, OrderDTO>(OrderRequest);

            //Step4: Print the OrderDTO Data
            Console.WriteLine("After Mapping - OrderDTO Data");
            Console.WriteLine("OrderId : " + orderDTOData.OrderId);
            Console.WriteLine("NumberOfItems : " + orderDTOData.NumberOfItems);
            Console.WriteLine("TotalAmount : " + orderDTOData.TotalAmount);
            Console.WriteLine("CustomerId : " + orderDTOData.customer.CustomerID);
            Console.WriteLine("FullName : " + orderDTOData.customer.FullName);
            Console.WriteLine("Postcode : " + orderDTOData.customer.Postcode);
            Console.WriteLine("ContactNo : " + orderDTOData.customer.ContactNo);
            Console.WriteLine();

            //Step5: modify the OrderDTO data
            orderDTOData.OrderId = 10;
            orderDTOData.NumberOfItems = 20;
            orderDTOData.TotalAmount = 2000;
            orderDTOData.customer.CustomerID = 5;
            orderDTOData.customer.FullName = "James Smith";
            orderDTOData.customer.Postcode = "12345";

            //Step6: Reverse Map
            mapper.Map(orderDTOData, OrderRequest);

            //Step7: Print the Order Data
            Console.WriteLine("After Reverse Mapping - Order Data");
            Console.WriteLine("OrderNo : " + OrderRequest.OrderNo);
            Console.WriteLine("NumberOfItems : " + OrderRequest.NumberOfItems);
            Console.WriteLine("TotalAmount : " + OrderRequest.TotalAmount);
            Console.WriteLine("CustomerId : " + OrderRequest.CustomerId);
            Console.WriteLine("Name : " + OrderRequest.Name);
            Console.WriteLine("Postcode : " + OrderRequest.Postcode);
            Console.WriteLine("MobileNo : " + OrderRequest.MobileNo);
            Console.ReadLine();
        }

        private static Order CreateOrderRequest()
        {
            return new Order
            {
                OrderNo = 101,
                NumberOfItems = 3,
                TotalAmount = 1000,
                CustomerId = 777,
                Name = "James Smith",
                Postcode = "755019",
                MobileNo = "1234567890"
            };
        }

        static Mapper InitializeAutomapper()
        {
            var config = new MapperConfiguration(cfg => {
                cfg.CreateMap<Order, OrderDTO>()

                     .ForMember(dest => dest.OrderId, act => act.MapFrom(src => src.OrderNo))
                     .ForMember(dest => dest.customer, act => act.MapFrom(src => new Customer()
                     {
                         CustomerID = src.CustomerId,
                         FullName = src.Name,
                         Postcode = src.Postcode,
                         ContactNo = src.MobileNo
                     }))

                     .ReverseMap()

                     .ForMember(dest => dest.CustomerId, act => act.MapFrom(src => src.customer.CustomerID))
                     .ForMember(dest => dest.Name, act => act.MapFrom(src => src.customer.FullName))
                     .ForMember(dest => dest.MobileNo, act => act.MapFrom(src => src.customer.ContactNo))
                     .ForMember(dest => dest.Postcode, act => act.MapFrom(src => src.customer.Postcode));

            });
            
            var mapper = new Mapper(config);
            return mapper;
        }
    }

    public class Order
    {
        public int OrderNo { get; set; }
        public int NumberOfItems { get; set; }
        public int TotalAmount { get; set; }
        public int CustomerId { get; set; }
        public string Name { get; set; }
        public string Postcode { get; set; }
        public string MobileNo { get; set; }
    }
    public class Customer
    {
        public int CustomerID { get; set; }
        public string FullName { get; set; }
        public string Postcode { get; set; }
        public string ContactNo { get; set; }
    }
    public class OrderDTO
    {
        public int OrderId { get; set; }
        public int NumberOfItems { get; set; }
        public int TotalAmount { get; set; }
        public Customer customer { get; set; }
    }
}

Ora esegui l'applicazione e vedrai l'output come previsto, come mostrato nell'immagine sottostante.

Nel prossimo articolo parlerò di Mappatura condizionale utilizzando AutoMapper in C# con esempi. Qui, in questo articolo, provo a spiegare Mappatura inversa di AutoMapper in C# con esempi. Spero che questo AutoMapper C# Mappa inversa l'articolo ti aiuterà con il tuo bisogno. Mi piacerebbe avere il tuo feedback. Pubblica il tuo feedback, domanda o commenti su questo articolo.