Inicialização¶
Nosso aplicativo de referência será construído a partir do template Aplicação de Serviços Web do framework ABP. Documentos e detalhes sobre a utilização do inicializador de projetos do ABP podem ser conferidas na documentação do site oficial ⧉.
Uma visão geral dos componentes da aplicação pode ser vista na ilustração abaixo:

Este framework tem uma extensa documentação e é completamente funcional na versão community. Para os interesses desta aplicação, o utilitário de linha de comando é suficiente.
A versão de referência para este código pode ser obtida no git da Magna, no endereço POC Índices dotnet ⧉.
O utilitário pode ser instalado, caso não esteja ainda, através de linha de comando, da seguinte forma:
Esta aplicação contará com as seguintes características:
- Uma WebAPI sem front-end.
- API REST baseado em OpenAPI
- Entity framework como mecanismo de mapeamento objeto relacional.
Então, o comando de inicialização será o seguinte:
Examinando a parametrização:
new: É o comando para criação de uma nova solução.Magna.IndicePmo: é o nome da nossa solução-tou--template: Especifica o tipo de template utilizado. Nosso caso serámodule.--no-ui: Especifica o tipo de interface visual. Nosso caso será nenhuma, portantonone.-dou--database-provider: Especifica o mecanismo de alto nível para acesso a banco de dados. Nosso caso seráefpara utilizarmos o Entity Framework ⧉.--dbms: Utilizaremos o MySQL, versão 8 ⧉.--output-folder: Subdiretório magna-indicepmo.--version: Versão do template de geração e da ferramenta. Utilizaremos a versão 8.0.2 ⧉
!!!Warning "Diretório de criação do projeto"
Se a opção O comando --output-folder não for especificada, o utilitário criará a estrutura de projetos e o arquivo de solution no subdiretório aspnet-core.
Ao final da execução, teremos o diretório magna-indicepmo e alguns subdiretórios, conforme é possível ver na figura abaixo:
- O subdiretório
databasecontém comandos para inicialização de toda a solução compilada e os scripts de migração SQL embarcados em um container docker. - O subdiretório
hostcontém projetos que serão os "executáveis" de nossa solução. - O subdiretório
srccontém os subdiretórios organizados de acordo com a finalidade. - O subdiretório
testcontém projetos pré-configurados para execução de testes do código recém-gerado.
Customização dos projetos gerados pelo template¶
O ABP gera muitos módulos e artefatos que, para os objetivos dessa POC, podem ser removidos. Sugere-se ao leitor mais atento o estudo de cada um deles e a compreensão de sua utilidade. Em particular, sugere-se o estudo do servidor de Autenticação. No diretório magna-indicepmo, encontramos o arquivo Magna.IndicePmo.sln. Este arquivo é o organizador de todos os projetos e podemos abri-lo no Visual Studio.

Desta versão removeremos:
- Servidor de autenticação e dependências do MongoDB
- Referências ao servidor de autenticação
- Localization
Deixaremos comentado, para eventual interesse do leitor:
- DataProtection e dependências de cache distribuído
- CORS
- Uso de auditoria
- Redirecionamento para https
Migração e dataseeding¶
A sincronização de banco de dados e inclusão de informações de inicialização será criada num aplicativo separado. Isso é relevante para segregarmos sincronização do banco de dados da inicialização da aplicação como um todo.
Para isso criaremos um aplicativo utilitário do tipo console denominado Magna.IndicePmo.SincronizadorBd.
Como será um aplicativo executável, também esse aplicativo deve ser criado no diretório hosts da aplicação.
É necessário configurar o DbContext e definir os serviços que executarão a migração e o dataseeding.
O roteiro principal do Sincronizador será executado SincronizadorBdService que orquestrará tanto a execução das tarefas de migration do Entity Framework, quanto o roteiro de preenchimento inicial de dados.
Em seguida, é necessário configurar o funcionamento do aplicativo como um todo. A classe SincronizadorBdHostedService configurar o sincronizador para ser executado tanto como um aplicativo de linha de comando (console) quanto como um serviço hospedado (IHostedService).
Nesta etapa o aplicativo é apenas um conjunto de contratos! Mais adiante será de grande utilidade para o andamento das nossas tarefas.

Para completar a inicialização do utilitário de sincronização de banco de dados é necessário inicializar a base de dados.
Inicialização do banco de dados¶
Sugere-se a criação manual do banco de dados MySql. Isso pode ser feito através de aplicativo apropriado. Neste documento utilizamos o dbeaver - versão community ⧉.
Não entraremos em detalhes sobre a criação do banco de dados, volumetria, backups, encodings ou refinamento de privilégios.
É suficiente apenas, a partir de um servidor MySQL, versão 8 ou superior:
CREATE DATABASE `magna_igm_dotnet` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;
A criação de usuário habilitado para gerenciar este banco de dados:
E a atribuição de permissões administrativas sobre banco de dados:
Se tudo funcionou corretamente, uma nova base de dados será criada.

Configuração e execução da migration de inicialização¶
É necessário incluir as configurações recém-criadas na connection string do utilitário de sincronização.

Embora não haja tabelas ou classes de interesse funcional ainda, podemos criar uma primeira migração para este novo banco de dados.
É necessário abrir o terminal de comando no diretório do utilitário de sincronização. A partir do diretório raiz da solução:
Recomenda-se verificar se o utilitário de linha de comando entity framework já está instalado. Caso não esteja, a instalação pode ser feita da seguinte forma:
E finalmente, para gerar a migração inicial:

Este comando:
- Recompilará o utilitário de sincronização e as suas respectivas dependências.
- Irá gerar um modelo dos objetos da aplicação e os armazenará em um diretório denominado Migrations

Finalmente, o utilitário de migração será executado e uma primeira "versão" do esquema em banco de dados será criada.

Verificando a criação do esquema ...

A versão correspondente desta fase ⧉
Execução do host¶
Finalmente, podemos executar o host. O resultado esperado é apenas a inicialização da aplicação REST API, com o front-end padrão do swagger.

Isto encerra a fase de inicialização do projeto .net!
Iniciaremos agora a fase de implementação das funcionalidades propriamente ditas.