Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

O exemplo abaixo contém um mapeamento bidirecional com utilização via métodos de extensão:

Bloco de código
languagec#
firstline1
titleAutoMapAttribute
linenumberstrue
using Tnf.AutoMapper;
 
// two-way mapping
[AutoMap(typeof(MyClass2))]
public class MyClass1
{
    public string TestProp { get; set; }
}

public class MyClass2
{
    public string TestProp { get; set; }
}
 
// extensions methods mapping
var obj1 = new MyClass1 { TestProp = "Test value" };
var obj2 = obj1.MapTo<MyClass2>();
 
// extensions methods mapping
var obj1 = new MyClass1 { TestProp = "Test value" };
var obj2 = new MyClass2();
obj1.MapTo(obj2);

Configurando Profiles

Em muitos cenários realizamos algum mapeamento que contém alguma regra onde a propriedade de origem nem sempre é a mesma propriedade de destino. Um exemplo deste cenário seria uma entidade persistida em banco de dados onde tenha dois campos: Nome e Sobrenome. Essa entidade ao ser mapeada para um DTO por exemplo pode ser representada por uma propriedade chamada NomeCompleto onde terá a junção de Nome e Sobrenome.

Para esses casos criamos profiles no AutoMapper onde configuramos todo e qualquer comportamento adicional a ser realizado no mapeamento de valores:

Bloco de código
languagec#
firstline1
titleDtoToPocoProfile.cs
linenumberstrue
public class DtoToPocoProfile : Profile
{
	public DtoToPocoProfile()
	{
		CreateMap<CountryDto, CountryPoco>()
			.ForMember(d => d.Id, s => s.MapFrom(p => p.Id));
		CreateMap<ProfessionalDto, ProfessionalPoco>()
			.ForMember(d => d.Address, s => s.Ignore())
			.ForMember(d => d.AddressComplement, s => s.Ignore())
			.ForMember(d => d.AddressNumber, s => s.Ignore())
			.ForMember(d => d.ZipCode, s => s.Ignore())
			.ForMember(d => d.ProfessionalSpecialties, s => s.Ignore())
			.AfterMap((s, d) =>
			{
				d.Address = s.Address.Street;
				d.AddressComplement = s.Address.Complement;
				d.AddressNumber = s.Address.Number;
				d.ZipCode = s.Address.ZipCode.Number;
			});
		CreateMap<SpecialtyDto, SpecialtyPoco>();
		CreateMap<PresidentDto, PresidentPoco>();
	}
}

A classe de exemplo acima representa a criação de um profile com mapeamentos customizados.

Para podermos utilizar esse profile devemos configura-lo em nosso modulo:

Bloco de código
languagec#
firstline1
titleSampleModuleWithProfiles.cs
linenumberstrue
[DependsOn(
	typeof(TnfAutoMapperModule))]
public class SampleModule : TnfModule
{
	public override void PreInitialize()
	{
		base.PreInitialize();
 
		Configuration.Modules
        	.TnfAutoMapper()
            .Configurators
            .Add(config =>
            {
            	config.AddProfile(new DtoToPocoProfile());
            });
	}

	public override void Initialize()
	{
		IocManager.RegisterAssemblyByConvention(typeof(AppModule).GetAssembly());
	}
}