...
Bloco de código | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
[DependsOn(
typeof(TnfAutoMapperModule))]
public class SampleModule : TnfModule
{
public override void PreInitialize()
{
base.PreInitialize();
}
public override void Initialize()
{
IocManager.RegisterAssemblyByConvention(typeof(AppModule).GetAssembly());
}
} |
...
O exemplo abaixo contém um mapeamento bidirecional com utilização via métodos de extensão:
Bloco de código | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
using Tnf.App.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); |
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 | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
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 | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
[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());
}
} |