Lançado AutoMapper 4.2.0

Fala galera!

Eu

Recentemente foi lançada a versão 4.2.0 do AutoMapper framework de mapeamento de tipos que , desde que conheci, passou a integrar a minha caixa de ferramentas essenciais.

Caso voce não conheça o AutoMapper vem solucionar um dos tediosos problemas do desenvolvimento de sistemas em multiplas camadas: a conversão de Entidades do Domínio em DTOs (Data Transfer Objects) para comunicaçÃo entre estas camadas mantendo o encapsulamento do domínio.

A maior novidade desta última versão, além de diversas melhorias, foi a introdução de uma API não estática, o que facilita muito o uso com Containers de injeção de dependencia e aumenta a testabilidade.

DemonstraçÃo

Para demonstrar esta API e um pouco do poder do AutoMapper desenvolvi uma pequena aplicação que converte uma entidade de domínio em dois DTOs. distintos.

Crie um novo Console Application e adicione o pacote nuget do AutoMapper.

Comecemos com a declaração da nossa entidade:

public class Cliente
    {
        public string CNPJ { get; set; }
        public string RazaoSocial { get; set; }
        public string NomeFantasia { get; set; }
        public string InscricaoEstadual { get; set; }
        public Endereco Endereco { get; set; }
    }
public class Endereco
    {
        public string Logradouro { get; set; }
        public string Numero { get; set; }
        public string Complemento { get; set; }
        public string Bairro { get; set; }
        public string Cidade { get; set; }
        public string UF { get; set; }
        public string CEP { get; set; }
    }

Agora criaremos nossos dois DTOS:

public class ClienteDTO
    {
        public string CNPJ { get; set; }
        public string RazaoSocial { get; set; }
        public string NomeFantasia { get; set; }
        public string InscricaoEstadual { get; set; }
        public string EnderecoLogradouro { get; set; }
        public string EnderecoNumero { get; set; }
        public string EnderecoComplemento { get; set; }
        public string EnderecoBairro { get; set; }
        public string EnderecoCidade { get; set; }
        public string EnderecoUF { get; set; }
        public string EnderecoCEP { get; set; }
    }
public class EnvelopeDTO
    {
        public string Destinatario { get; set; }
        public string Linha1 { get; set; }
        public string Linha2 { get; set; }
        public string Linha3 { get; set; }
        public string CEP { get; set; }
    }

Notemos que no primeiro DTO estamos utilizando uma convençÃo do AutoMapper pra que ele consiga trabalhar de forma automatizada.

Para melhor organizar os mapeamentos gosto, mesmo que em projetos simples, de utilizar Profiles. Então em nosso exemplo ele ficará assim:

public class ClienteProfile: Profile
    {
        protected override void Configure()
        {
            CreateMap()
                .ForMember(dst => dst.InscricaoEstadual, opt => opt.NullSubstitute("Isento"));

            CreateMap()
                .ForMember(dst => dst.Destinatario, opt => opt.MapFrom(src => src.NomeFantasia))
                .ForMember(dst => dst.Linha1, opt => opt.MapFrom(src =>
                    src.Endereco.Logradouro + ", " + src.Endereco.Numero +
                    src.Endereco.Complemento ?? string.Empty))
                .ForMember(dst => dst.Linha2, opt => opt.MapFrom(src => src.Endereco.Bairro))
                .ForMember(dst => dst.Linha3, opt => opt.MapFrom(src =>
                    src.Endereco.Cidade + " - " + src.Endereco.UF))
                .ForMember(dst => dst.CEP, opt => opt.MapFrom(src => src.Endereco.CEP));
        }         
    }

Perceba o que fizemos em relação a Inscrição Estadual. Caso a mesma esteja nula será substituida pela palavra Isento.

Agora colocando tudo para funcionar:

class Program
    {
        private static IMapper mapper;

        static void Main(string[] args)
        {
            var config = new MapperConfiguration(cfg =>
            {
                cfg.AddProfile();
            });
            mapper = config.CreateMapper();

            Cliente_ClienteDTO();
            Cliente_EnvelopeDTO();
        }

        private static void Cliente_ClienteDTO()
        {
            System.Console.WriteLine("Convertendo um Cliente para ClienteDTO");
            var cliente = new Cliente()
            {
                CNPJ = "00.000.000/0001-0",
                RazaoSocial = "Razão Social",
                NomeFantasia = "Nome Fantasia",
                Endereco = new Endereco()
                {
                    Logradouro = "Rua",
                    Numero = "123",
                    Bairro = "Bairro",
                    Cidade = "Cidade",
                    UF = "SP",
                    CEP = "08209-000"
                }
            };

            var dto = mapper.Map(cliente);

            System.Console.WriteLine("Razão Social: {0}", dto.RazaoSocial);
            System.Console.WriteLine("Nome Fantasia:{0}", dto.EnderecoLogradouro);
            System.Console.WriteLine("CNPJ: {0}", dto.CNPJ);
            System.Console.WriteLine("Inscr. EStadual: {0}", dto.InscricaoEstadual);
            System.Console.WriteLine("Endereço: {0}, {1} {2}", dto.EnderecoLogradouro, dto.EnderecoNumero,
                dto.EnderecoComplemento);

            System.Console.WriteLine("Pressione ENTER para continuar.");
            System.Console.ReadLine();
        }

        private static void Cliente_EnvelopeDTO()
        {
            var cliente = new Cliente()
            {                                
                NomeFantasia = "Alexandre Santos Costa",
                Endereco = new Endereco()
                {
                    Logradouro = "Rua das Lendas",
                    Numero = "229",
                    Bairro = "Jardim das Na;óes",
                    Cidade = "Sáo Paulo",
                    UF = "SP",
                    CEP = "08209-000"
                }
            };

            var dto = mapper.Map(cliente);

            System.Console.WriteLine(dto.Destinatario);
            System.Console.WriteLine(dto.Linha1);
            System.Console.WriteLine(dto.Linha2);
            System.Console.WriteLine("{0} CEP: {1}", dto.Linha3, dto.CEP);

            System.Console.WriteLine("Pressione ENTER para continuar.");

            System.Console.ReadLine();
        }
    }

Até a próxima!

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s