Quando trabalhamos em um modelo multicamada precisamos em muitos cenários realizar o mapeamento de nossa entidade de infraestrutura (utilizada para representar a tabela do Entity Framework, o documento em um banco NoSQL, etc).
Para isso o TNF tráz facilitadores na hora de mapear objetos e entidades para estruturas de DTO utilizando o AutoMapper.
Para obter suporte ao AutoMapper instale o pacote via nuget Tnf.AutoMapper disponível em nosso package source: https://www.myget.org/F/tnf/api/v3/index.json
Para utilizar os mapeamentos via atributos lembre-se de colocar o modulo TnfAutoMapperModule como dependência em sua aplicação.
Para fazer isso use o atributo "DependsOn" para informar a dependência em seu módulo:
[DependsOn( typeof(TnfAutoMapperModule))] public class AppModule : TnfModule { public override void PreInitialize() { base.PreInitialize(); } public override void Initialize() { IocManager.RegisterAssemblyByConvention(typeof(AppModule).GetAssembly()); } }
O exemplo abaixo exibe uma forma da utilização da estrutura do AutoMapper:
public SearchPeopleOutput SearchPeople(SearchPeopleInput input) { var peopleEntityList = _personRepository.GetAllList(person => person.Name.Contains(input.SearchedName)); return new SearchPeopleOutput() { People = Mapper.Map<List<PersonDto>>(peopleEntityList) }; }
Como o AutoMapper precisa ser configurado (definidos os mapeamentos), isso pode ser feito através da estrutura de módulos do TNF.
No método PostInitialize de um modulo criado para um assembly que realize o uso do AutoMapper, você pode configurar as entidades que serão mapeadas
No TNF estão disponíveis atributos e métodos de extensão para definir mapeamentos.
Em seguida, use o atributo AutoMap para mapeamento bidirecional, AutoMapFrom e AutoMapTo para mapeamento de um sentido apenas.
O exemplo abaixo contém um mapeamento bidirecional com utilização via métodos de extensão:
// 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);