Árvore de páginas

Versões comparadas

Chave

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

...

O TNF introduz o conceito de DTOs (abreviatura para Data Transfer Objects) para fazer a comunicação entre as camadas de modo que eles atuem em todos os pontos de sua aplicação (cross-cutting).

A utilização de DTOs proveem um isolamento, respeitando assim o modelo de multicamadas evitando que a aplicação manipule diretamente as entidades de negócio.

Para termos suporte a estrutura de Data Transfer Objects do TNF, instale via nuget o pacote Tnf.Dto disponível em: https://www.myget.org/F/tnf/api/v3/index.json.

Porque utilizar?

Abstração da camada de domínio

Os DTOs fornecem uma maneira eficiente de abstrair objetos de domínio da camada de apresentação. Assim, suas camadas são separadas corretamente. Mesmo que você queira alterar completamente a camada de apresentação, você pode continuar com as camadas de domínio e de aplicação existentes. Como o oposto, você pode reescrever sua camada de domínio, alterar completamente o esquema de banco de dados, entidades e estrutura de ORM sem qualquer alteração na camada de apresentação, contanto que os contratos (assinaturas de métodos e DTOs) de seus serviços permaneçam inalterados.

Data hiding

 Pense que você tenha uma entidade de usuário com propriedades Id, Nome e campos de Senha. Se o método ObterTodosUsuarios() de um serviço de aplicação chamado UsuarioAppService retornar uma Lista <Usuário>, qualquer pessoa pode ver senhas de todos os usuários, mesmo que você não a mostre na tela. Não se trata apenas de segurança, trata-se de ocultar dados. O serviço de aplicação deve retornar à camada de apresentação o que ele precisa. Não mais, nem menos.Problemas com serialização e lazy load

...

 O uso de DTOs evitam problemas como os descritos acima porque são criados para retornar estruturas especificas de dados para que nenhuma informação excessiva seja trafegada erroneamente.

Auto mapeamento entre DTOs e entidades

Felizmente, existem ferramentas que tornam isso muito fácil. AutoMapper é um deles. O TNF traz consigo suporte a ele como no exemplo descrito abaixo:

Bloco de código
languagec#
firstline1
titleAutoMapper
linenumberstrue
public SearchPeopleOutput SearchPeople(SearchPeopleInput input)
{
    var peopleEntityList = _personRepository.GetAllList(person => person.Name.Contains(input.SearchedName));
    return new SearchPeopleOutput { People = Mapper.Map<List<PersonDto>>(peopleEntityList) };
}

Você pode definir os mapeamentos manuais no método PostInitialize de seu modulo do TNF.

Mapeamento usando atributos e métodos de extensão

O TNF fornece vários atributos e métodos de extensão para definir mapeamentos.

Para utilizar basta fazer a instalação do pacote Tnf.AutoMapper disponível em nomo package souce: https://www.myget.org/F/tnf/api/v3/index.json

Em seguida, use o atributo AutoMap para mapeamento bidirecional, AutoMapFrom e AutoMapTo para mapeamento de uma maneira. Use métodos de extensão MapTo para mapear um objeto para outro. Exemplo de definição de mapeamento:

Bloco de código
languagec#
firstline1
titleAutoMapAttribute
linenumberstrue
// 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);

...