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-t
ou--template
: Especifica o tipo de template utilizado. Nosso caso serámodule
.--no-ui
: Especifica o tipo de interface visual. Nosso caso será nenhuma, portantonone
.-d
ou--database-provider
: Especifica o mecanismo de alto nível para acesso a banco de dados. Nosso caso seráef
para 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
database
conté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
host
contém projetos que serão os "executáveis" de nossa solução. - O subdiretório
src
contém os subdiretórios organizados de acordo com a finalidade. - O subdiretório
test
conté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.