Implementação das funcionalidades¶
O núcleo funcional da implementação está organizado entre os projetos Magna.IndicePmo.Application e Magna.IndicePmo.Domain, Magna.IndicePmo.Application.Contracts e Magna.IndicePmo.Domain.Shared.
Núcleo funcional¶
Application.Contracts e Domain.Shared¶
- Descreve os DTO, configurações e serviços de aplicação que interfaceiam com a camada pública de API.
- Auxiliares para mapeamento de erros e códigos de erros padronizados.
Application¶
- Recebe como parâmetros de entrada, DTO organizados em
Magna.IndicePmo.Application.Contracts. - Organiza as operações funcionais, implementadas
Magna.IndicePmo.Domain. - Recruta serviços de aplicação, como mapeamentos e repositórios de persistência.
Nesta POC, utilizaremos apenas uma classe do tipo ApplicationService, denominada GestorAvaliacoesAppService. Classes do tipo Serviços da Aplicação, na terminologia do DDD, são artefatos capazes de coordenar operações entre um ou mais serviços de domínio e recursos de infraestrutura e persistência inerentes à aplicação.
Alguns pontos importantes:
- É esta camada camada que responde às requisições provenientes da API pública do nosso serviço (representada por
Magna.IndicePmo.HttpApi). - As operações realizadas com este serviço recebem DTO como entradas de dados e retornam DTO como respostas.
- Utiliza-se um wrapper baseado no Result Pattern ⧉. Esta é uma escolha para descrever resultados de operações sem o recurso excessivo de
throw exception. - Embora
GestorAvaliacoesAppServicemanipule asentitieseaggregation rootsdo domínio, evitamos expor esses objetos para evitarmos problemas de lazy loading quando o contexto de obtenção de dados já foi encerrado. - Esta escolhas oneram o sistema em mais uma camada de mapeamento, implementada na classe utilitária
IndicePmoApplicationAutoMapperProfile.
A estrutura geral de cada operação em GestorAvaliacoesAppService tem as seguintes etapas:

Explicando:
Passo 1: Execução de uma operação de domínio. Neste caso, a obtenção de um registro de avaliação.Passo 2: Mapeamento para DTO de uma situação de falha. Neste caso, registro não encontrado.Passo 3: Execução de uma operação de domínio. Neste caso, a atualização do preenchimento de um registro.Passo 4: Mapeamento para DTO do resultado da operação de atualização.
Domain¶
Uma única classe do tipo serviço de domínio, GestorAvaliacaoService.
Implementa as operações lógicas para:
- Gestão dos templates de avaliação. Um para cada tipo de índice.
- Criação de uma nova avaliação.
- Modificação do score de cada item de avaliação.
- Recálculo de score da avaliação.
- Orquestração da gravação e leitura a partir de repositórios.
- Representação de questoes e avaliações como entidades e aggregation roots, respectivamente. Bem como a lógica de inicialização destes objetos de domínio.
Adicionalmente, o diretório DataServices contém a especificação de repositórios e interfaces para realizar as rotinas de gravação, leitura, remoção de dados.

Persistência dos dados¶
Nesta fase da implementação, é possível adiar a preocupação com a persistência concreta dos dados. Para isso, incluímos uma implementação in-memory para os serviços representados pela interface IAvaliacoesDataService diretamente no projeto de domínio.
Com efeito, retornaremos à persistência em base de dados na próxima seção.
Magna.IndicePmo.EntityFrameworkCore¶
Implementa as operações de DataServices para o banco de dados MySql. Retornaremos a esta implementação na próxima seção.
Interligação com HttpAPI¶
É possível retornar em HttpApi e interligá-lo com Magna.IndicePmo.Application.Contracts. Esta interligação completa a implementação necessária para o tráfego de dados entre a interface pública da API e o núcleo funcional.
- As classes controladoras utilizarão as operações descritas no contrato
IGestorAvaliacoesService. - Incluiremos a classe
ApiV2AutoMapperProfilepara realizar mapeamento entre os objetos do ViewModel e os objetos DTO do núcleo funcional.
Feito isso, uma operação típica em cada classe de controller terá a seguinte estrutura da seguinte forma:

Explicando:
Passo 1: Mapeamento do view model para um DTO.Passo 2: Execução de uma operação funcional. Note-se que_appServiceé uma instância deIGestorAvaliacoesService.Passo 3: Transformação do resultado da operação em um viewModel compatível com o contrato da API pública.
Neste momento, a nossa versão compilada agora é capaz de realizar as operações funcionais com nossa API e verificar a correção dos resultados.

Na próxima etapa, interligaremos um front-end baseado em React com a nossa API.