Do Zero ao Build: Guia Passo a Passo
Este tΓ³pico apresenta um guia prΓ‘tico e orientado por passos para usar o Lino CLI como ferramenta principal na construΓ§Γ£o de um projeto: desde a instalaΓ§Γ£o e configuraΓ§Γ£o inicial, passando pela geraΓ§Γ£o de serviΓ§os, mΓ³dulos e entidades, atΓ© recursos avanΓ§ados como eventos, jobs em background, migraΓ§Γ΅es, build de imagens Docker e versionamento.
O objetivo Γ© mostrar, de forma integrada, como os comandos do CLI se encaixam no fluxo de desenvolvimento real β nΓ£o apenas listΓ‘-los, mas explicar o porquΓͺ de cada escolha, o que Γ© gerado automaticamente e quais sΓ£o as implicaΓ§Γ΅es arquiteturais.
Mesmo que cada comando jΓ‘ tenha documentaΓ§Γ£o especΓfica, aqui vocΓͺ verΓ‘ o processo fim-a-fim β um roteiro reproduzΓvel que economiza horas de trabalho repetitivo e ajuda a manter um cΓ³digo consistente e testΓ‘vel.
Ao longo do guia, explicaremos conceitos tΓ©cnicos aplicados pelo Lino (ex.: CQRS, TypedResults, Source Generators, Outbox Pattern), mostraremos exemplos de comandos e indicaremos boas prΓ‘ticas para versionamento, deploy e integraΓ§Γ£o contΓnua.
Instalando e configurando o Lino CLI
O primeiro passo para comeΓ§ar a trabalhar com o Lino CLI Γ© instalar a ferramenta em seu ambiente de desenvolvimento. Ela Γ© distribuΓda como uma dotnet global tool, o que significa que estarΓ‘ disponΓvel para qualquer projeto .NET no seu computador.
Passo 1: InstalaΓ§Γ£o
Para instalar (ou atualizar) o Lino CLI, execute o seguinte comando no terminal:
dotnet tool install --global Tolitech.Lino
ObservaΓ§Γ΅es importantes:
- Se jΓ‘ houver uma versΓ£o instalada, vocΓͺ pode usar
dotnet tool update --global Tolitech.Linopara atualizar. - Verifique se o diretΓ³rio de ferramentas globais do .NET estΓ‘ no
PATHdo sistema para que o comandolinofuncione corretamente.
Passo 2: Configurar idioma
ApΓ³s a instalaΓ§Γ£o, Γ© recomendado configurar o idioma (ou cultura) que o CLI irΓ‘ utilizar em mensagens, prompts e logs:
lino preferences culture set
VocΓͺ serΓ‘ solicitado a escolher entre os idiomas disponΓveis. Essa configuraΓ§Γ£o garante que todas as instruΓ§Γ΅es e prompts apareΓ§am de forma consistente no idioma desejado.
Passo 3: AutenticaΓ§Γ£o e registro
Para acessar todos os recursos do Lino, incluindo templates avanΓ§ados, publicaΓ§Γ£o de imagens Docker e integraΓ§Γ΅es com serviΓ§os externos, Γ© necessΓ‘rio estar autenticado.
- Caso ainda nΓ£o possua cadastro, registre-se com o comando:
lino user register
- Caso jΓ‘ tenha cadastro, faΓ§a login com:
lino auth login
O que acontece: o CLI armazena um token de autenticaΓ§Γ£o localmente, permitindo que vocΓͺ execute comandos que requerem acesso a recursos protegidos sem precisar se logar a cada uso.
Passo 4: VerificaΓ§Γ£o
Para confirmar que a instalaΓ§Γ£o e autenticaΓ§Γ£o foram realizadas com sucesso, execute:
lino --version
Se o comando retornar a versΓ£o instalada, vocΓͺ estΓ‘ pronto para comeΓ§ar a utilizar o Lino CLI em seus projetos.
Criando o projeto MyApp
Neste passo, vamos criar a estrutura inicial do projeto utilizando o Lino CLI. Este projeto servirΓ‘ como base para demonstrar a criaΓ§Γ£o de serviΓ§os, mΓ³dulos, front-end e toda a integraΓ§Γ£o de eventos.
Passo 1: Executando o comando de criaΓ§Γ£o
Para criar um novo projeto, execute o comando abaixo no terminal:
lino project new
O CLI irΓ‘ guiΓ‘-lo passo a passo, solicitando informaΓ§Γ΅es como:
- Nome do projeto: usaremos
MyApp, mas vocΓͺ pode escolher qualquer nome que desejar; - Recursos adicionais: analisadores de cΓ³digo, cache distribuΓdo, suporte a eventos assΓncronos, etc.
Passo 2: Configurando recursos essenciais
Para este projeto, recomendamos habilitar os seguintes recursos desde o inΓcio:
- Analisadores de cΓ³digo: para garantir que o cΓ³digo esteja seguindo boas prΓ‘ticas e padrΓ΅es consistentes, prevenindo erros comuns de implementaΓ§Γ£o;
- Cache distribuΓdo: melhora a performance da aplicaΓ§Γ£o em cenΓ‘rios com mΓΊltiplos serviΓ§os, evitando consultas desnecessΓ‘rias ao banco de dados;
- ComunicaΓ§Γ£o assΓncrona: habilita o uso de eventos e filas para integraΓ§Γ£o entre serviΓ§os, garantindo escalabilidade e desacoplamento.
Γ importante habilitar todas essas opΓ§Γ΅es neste projeto, pois criaremos mΓΊltiplos serviΓ§os que irΓ£o se comunicar atravΓ©s de eventos de integraΓ§Γ£o. Isso permitirΓ‘ que vocΓͺ compreenda como estruturar sistemas modulares e distribuΓdos usando o Lino.
Passo 3: Estrutura gerada
ApΓ³s a execuΓ§Γ£o do comando e configuraΓ§Γ£o dos recursos, o CLI irΓ‘ gerar a estrutura inicial do projeto. Ela incluirΓ‘:
- Pastas de serviΓ§os e mΓ³dulos;
- Templates para front-end (se aplicΓ‘vel);
- ConfiguraΓ§Γ΅es iniciais de cache, eventos e integraΓ§Γ΅es;
- Arquivos de soluΓ§Γ£o (.slnx) e projeto (.csproj) prontos para compilaΓ§Γ£o.
Agora seu projeto MyApp estΓ‘ pronto para receber os serviΓ§os, mΓ³dulos, entidades e front-end que configuraremos nos prΓ³ximos passos.
Adicionando o frontend
Agora vamos criar a interface do sistema, o frontend, que serΓ‘ utilizado como Backoffice. Este frontend nΓ£o serΓ‘ uma aplicaΓ§Γ£o pΓΊblica, mas sim uma ferramenta interna para que administradores e gestores possam gerenciar produtos, categorias, estoques, vendas e outras informaΓ§Γ΅es do sistema.
Passo 1: Executando o comando de criaΓ§Γ£o
Para adicionar um novo frontend ao projeto, utilize o seguinte comando no terminal:
lino webapp new
O CLI irΓ‘ solicitar algumas informaΓ§Γ΅es durante o processo, como:
- Nome da aplicaΓ§Γ£o web: usaremos
Backofficepara este exemplo;
Passo 2: Estrutura gerada
Ao final do processo, o CLI irΓ‘ gerar a estrutura inicial do frontend dentro da pasta WebApps/Backoffice.
A estrutura padrΓ£o inclui:
- Pastas para pΓ‘ginas, componentes e serviΓ§os da aplicaΓ§Γ£o;
- Clientes HTTP para consumir APIs dos serviΓ§os do projeto;
- Templates iniciais;
- Arquivos de configuraΓ§Γ£o para integraΓ§Γ£o com autenticaΓ§Γ£o, autorizaΓ§Γ£o e eventos do sistema.
ObservaΓ§Γ΅es importantes
- O frontend serΓ‘ automaticamente integrado aos serviΓ§os e mΓ³dulos selecionados, permitindo que dados de produtos, categorias e vendas sejam consumidos diretamente via APIs geradas pelo Lino.
- VocΓͺ pode criar mΓΊltiplos frontends, por exemplo, um para administradores (Backoffice) e outro pΓΊblico (Site), seguindo o mesmo processo.
Com o frontend criado, estamos prontos para avanΓ§ar para a criaΓ§Γ£o dos serviΓ§os e mΓ³dulos que irΓ£o fornecer os dados e regras de negΓ³cio para esta aplicaΓ§Γ£o.
Criando serviΓ§os e mΓ³dulos
Nesta etapa, vamos construir os serviΓ§os e mΓ³dulos que irΓ£o compor a aplicaΓ§Γ£o. O objetivo Γ© criar uma arquitetura modular e escalΓ‘vel, permitindo que diferentes Γ‘reas do sistema, como produtos, categorias, estoque, vendas e mΓdia, evoluam de forma independente, mantendo coesΓ£o e facilitando a manutenΓ§Γ£o.
Passo 1: Definindo os serviΓ§os
Inicialmente, criaremos os seguintes serviΓ§os, cada um com responsabilidades bem definidas:
- Catalog (modular) β responsΓ‘vel por gerenciar produtos, categorias e preΓ§os;
- Sales β responsΓ‘vel pelo processamento de vendas e pedidos;
- Stock β responsΓ‘vel pelo gerenciamento de estoques e movimentaΓ§Γ΅es;
- Security β responsΓ‘vel por autenticaΓ§Γ£o, autorizaΓ§Γ£o e gerenciamento de usuΓ‘rios.
Para criar um novo serviΓ§o, execute o comando:
lino service new
Durante a execuΓ§Γ£o do comando, o CLI irΓ‘ solicitar:
- Nome do serviΓ§o: por exemplo,
Catalog; - Banco de dados: escolha a tecnologia que se adequa melhor ao seu projeto (SQL Server, PostgreSQL, etc.);
Passo 2: Criando mΓ³dulos dentro de serviΓ§os
Nem todos os serviΓ§os precisam ser modulares. No nosso projeto, apenas o serviΓ§o Catalog terΓ‘ mΓ³dulos, para separar responsabilidades como merchandising e precificaΓ§Γ£o.
Definimos para o serviΓ§o Catalog os seguintes mΓ³dulos:
- Merchandising β gerenciamento de produtos e categorias;
- Pricing β gerenciamento de preΓ§os, promoΓ§Γ΅es e histΓ³rico de alteraΓ§Γ΅es.
Para criar um mΓ³dulo, execute o comando:
lino module new
VocΓͺ pode criar quantos mΓ³dulos desejar dentro do serviΓ§o modular Catalog. AlΓ©m disso, dependendo da complexidade, alguns mΓ³dulos poderiam se tornar serviΓ§os independentes futuramente. A separaΓ§Γ£o apresentada aqui Γ© apenas didΓ‘tica e serve como exemplo de organizaΓ§Γ£o modular.
Estrutura final do projeto
ApΓ³s a criaΓ§Γ£o dos serviΓ§os e mΓ³dulos, sua soluΓ§Γ£o deverΓ‘ ter uma estrutura semelhante Γ seguinte:
MyApp/
βββ src/
βββ Aspire/
βββ Integrations/
βββ Services/
β βββ Catalog/
β β βββ Modules/
β β β βββ Merchandising/
β β β βββ Pricing/
β β βββ MyApp.Catalog.Host
β β βββ MyApp.Catalog.Infrastructure
β βββ Sales/
β βββ Security/
β βββ Shared/
β βββ Stock/
βββ WebApps/
βββ Backoffice/
β βββ Services/
β β βββ Catalog/
β β βββ Sales/
β β βββ Security/
β β βββ Stock/
β βββ MyApp.WebApp.Backoffice
β βββ MyApp.WebApp.Backoffice.Client
βββ Shared/
βββ MyApp.WebApp.Shared
βββ tests/
βββ Services/
βββ Catalog/
β βββ Merchandising/
β βββ Pricing/
βββ Sales/
βββ Security/
βββ Shared/
βββ Stock/
ExplicaΓ§Γ£o da estrutura:
Services/: contΓ©m todos os serviΓ§os do sistema, cada um isolado com sua prΓ³pria lΓ³gica de negΓ³cio, infraestrutura e hospedagem;Modules/: pastas dentro de serviΓ§os modulares, permitindo organizar funcionalidades especΓficas e manter cΓ³digo coeso;WebApps/: frontends associados ao sistema, jΓ‘ integrados aos serviΓ§os;Shared/: bibliotecas e recursos compartilhados entre serviΓ§os e frontends;tests/: testes unitΓ‘rios e de integraΓ§Γ£o organizados por serviΓ§o e mΓ³dulo.
Com essa estrutura modular, cada equipe ou desenvolvedor pode trabalhar de forma independente em diferentes partes do sistema, facilitando escalabilidade, manutenΓ§Γ£o e testes.
Adicionando autenticaΓ§Γ£o e autorizaΓ§Γ£o
A autenticaΓ§Γ£o e autorizaΓ§Γ£o sΓ£o elementos essenciais de qualquer sistema moderno. No Lino CLI, adicionΓ‘-las ao seu projeto Γ© simples e rΓ‘pido.
Passo 1: Executando o comando de autenticaΓ§Γ£o
Para adicionar os recursos de autenticaΓ§Γ£o e autorizaΓ§Γ£o, utilize o comando:
lino features auth add
O CLI irΓ‘ guiΓ‘-lo pelas seguintes etapas:
- Escolha do serviΓ§o ou mΓ³dulo: vocΓͺ precisa indicar onde os artefatos de autenticaΓ§Γ£o serΓ£o instalados. No nosso projeto de exemplo, utilizamos o serviΓ§o Security, que centraliza toda a lΓ³gica de seguranΓ§a do sistema;
- ConfiguraΓ§Γ΅es adicionais: criaΓ§Γ£o de tabelas de usuΓ‘rios, papΓ©is, permissΓ΅es e configuraΓ§Γ£o de polΓticas de acesso.
Passo 2: Estrutura gerada
ApΓ³s a execuΓ§Γ£o do comando, o serviΓ§o Security conterΓ‘ arquivos e pastas como:
- Entities: classes de usuΓ‘rios, papΓ©is e permissΓ΅es;
- Infrastructure: configuraΓ§Γ΅es do banco de dados e migrations para criar tabelas;
- Application: serviΓ§os de autenticaΓ§Γ£o, gerenciamento de usuΓ‘rios e validaΓ§Γ£o de credenciais;
- API/Host: endpoints para login, logout, cadastro e gerenciamento de papΓ©is.
Com isso, sua aplicaΓ§Γ£o terΓ‘ autenticaΓ§Γ£o robusta e controle de acesso granular, pronta para suportar mΓΊltiplos usuΓ‘rios e diferentes nΓveis de permissΓ΅es.
Adicionando Background Jobs
Em sistemas distribuΓdos e modulares, como o que estamos construindo com o Lino CLI, nem todos os serviΓ§os se comunicam diretamente entre si. Para garantir consistΓͺncia e confiabilidade na troca de informaΓ§Γ΅es, utilizamos eventos de integraΓ§Γ£o. PorΓ©m, para processar esses eventos de forma eficiente e assΓncrona, precisamos de Background Jobs.
O Lino utiliza o padrΓ£o Outbox Pattern para garantir que todas as mensagens geradas pelos serviΓ§os sejam registradas de forma confiΓ‘vel antes de serem enviadas. Com isso, conseguimos:
- Evitar a perda de eventos em caso de falhas ou reinicializaΓ§Γ΅es do serviΓ§o;
- Garantir que a mesma mensagem seja enviada apenas uma vez;
- Permitir o reprocessamento de mensagens em caso de falha na entrega;
- Separar o processamento de eventos da lΓ³gica principal da aplicaΓ§Γ£o, melhorando performance e escalabilidade.
Passo 1: Executando o comando
Para adicionar suporte a Background Jobs no seu projeto, execute o comando:
lino features background-job add
O CLI irΓ‘ solicitar que vocΓͺ selecione o serviΓ§o onde o Background Job serΓ‘ instalado. Geralmente, vocΓͺ escolherΓ‘ o serviΓ§o que centraliza a produΓ§Γ£o de eventos, como Catalog ou Sales.
Passo 2: Configurando a execuΓ§Γ£o
Durante a configuraΓ§Γ£o, vocΓͺ poderΓ‘ definir:
- Intervalo de verificaΓ§Γ£o: determina com que frequΓͺncia o Background Job irΓ‘ verificar a tabela Outbox para novas mensagens. Um intervalo muito curto pode aumentar o uso de recursos, enquanto um intervalo longo pode atrasar a entrega de eventos;
- Lote de registros processados por vez: controla quantos eventos serΓ£o lidos e enviados por execuΓ§Γ£o. Lotes maiores podem aumentar a performance, mas exigem mais memΓ³ria e processamento;
- PolΓtica de retries: em caso de falha no envio de mensagens, vocΓͺ poderΓ‘ configurar quantas vezes o job tentarΓ‘ reenviar.
Esses parΓ’metros dependem do tamanho do seu sistema, da capacidade da mΓ‘quina e do volume esperado de eventos.
Passo 3: Estrutura gerada
ApΓ³s a configuraΓ§Γ£o, o projeto terΓ‘ um Background Job pronto para processar mensagens das tabelas Outbox em cada serviΓ§o.
Com isso, vocΓͺ garante que todos os eventos de integraΓ§Γ£o sejam processados de forma confiΓ‘vel e eficiente, permitindo que mΓΊltiplos serviΓ§os e mΓ³dulos se comuniquem de forma assΓncrona, sem impactar a performance do sistema principal.
Criando entidades e enumeraΓ§Γ΅es
Nesta seΓ§Γ£o, vamos detalhar o design das entidades, enumeraΓ§Γ΅es e objetos de valor da aplicaΓ§Γ£o, mostrando em quais serviΓ§os e mΓ³dulos cada item serΓ‘ criado.
1. Criando a entidade Category
Para criar a entidade, utilize o comando:
lino entity new
A entidade serΓ‘ criada no serviΓ§o Catalog e no mΓ³dulo Merchandising com a seguinte estrutura:
ββββββ¬βββββ¬ββββββββββββββββ¬βββββββββ¬βββββββββ¬βββββββββββ¬βββββββββββββββββ β PK β FK β Property name β Type β Length β Required β Auto-increment β ββββββΌβββββΌββββββββββββββββΌβββββββββΌβββββββββΌβββββββββββΌβββββββββββββββββ€ β x β β Id β Guid β β x β x β ββββββΌβββββΌββββββββββββββββΌβββββββββΌβββββββββΌβββββββββββΌβββββββββββββββββ€ β β β Name β string β 50 β x β β ββββββ΄βββββ΄ββββββββββββββββ΄βββββββββ΄βββββββββ΄βββββββββββ΄βββββββββββββββββ
2. Criando a entidade Product
Em seguida, criamos a entidade Product no mesmo serviΓ§o e mΓ³dulo, incluindo objetos de valor e enumeraΓ§Γ΅es:
ββββββ¬βββββ¬ββββββββββββββββ¬ββββββββββββββ¬βββββββββ¬βββββββββββ¬βββββββββββββββββ β PK β FK β Property name β Type β Length β Required β Auto-increment β ββββββΌβββββΌββββββββββββββββΌββββββββββββββΌβββββββββΌβββββββββββΌβββββββββββββββββ€ β x β β Id β Guid β β x β x β ββββββΌβββββΌββββββββββββββββΌββββββββββββββΌβββββββββΌβββββββββββΌβββββββββββββββββ€ β β β Name β string β 100 β x β β ββββββΌβββββΌββββββββββββββββΌββββββββββββββΌβββββββββΌβββββββββββΌβββββββββββββββββ€ β β β Description β string β 500 β x β β ββββββΌβββββΌββββββββββββββββΌββββββββββββββΌβββββββββΌβββββββββββΌβββββββββββββββββ€ β β β Price β decimal β β x β β ββββββΌβββββΌββββββββββββββββΌββββββββββββββΌβββββββββΌβββββββββββΌβββββββββββββββββ€ β β x β CategoryId β Category β β x β β ββββββΌβββββΌββββββββββββββββΌββββββββββββββΌβββββββββΌβββββββββββΌβββββββββββββββββ€ β β β Dimensions β ValueObject β β β β ββββββΌβββββΌββββββββββββββββΌββββββββββββββΌβββββββββΌβββββββββββΌβββββββββββββββββ€ β β β Status β Enum β β x β β ββββββ΄βββββ΄ββββββββββββββββ΄ββββββββββββββ΄βββββββββ΄βββββββββββ΄βββββββββββββββββ
2.1 Criando o Value Object ProductDimension
Este Value Object representa as dimensΓ΅es do produto:
βββββββββββββββββ¬ββββββββββ¬βββββββββ¬βββββββββββ β Property name β Type β Length β Required β βββββββββββββββββΌββββββββββΌβββββββββΌβββββββββββ€ β Width β decimal β β x β βββββββββββββββββΌββββββββββΌβββββββββΌβββββββββββ€ β Height β decimal β β x β βββββββββββββββββΌββββββββββΌβββββββββΌβββββββββββ€ β Depth β decimal β β x β βββββββββββββββββ΄ββββββββββ΄βββββββββ΄βββββββββββ
2.2 Criando a Enum ProductStatus
Esta enum define o status do produto:
βββββββββ¬βββββββββββββββ¬βββββββββββββββ β Value β Name β Display Name β βββββββββΌβββββββββββββββΌβββββββββββββββ€ β 1 β Active β Active β βββββββββΌβββββββββββββββΌβββββββββββββββ€ β 2 β Inactive β Inactive β βββββββββΌβββββββββββββββΌβββββββββββββββ€ β 3 β Discontinued β Discontinued β βββββββββ΄βββββββββββββββ΄βββββββββββββββ
3. Adicionando novas propriedades
Com a evoluΓ§Γ£o do projeto, podemos editar entidades existentes para adicionar novas propriedades.
Por exemplo, adicionaremos uma lista de imagens Γ entidade Product:
lino entity edit
Criando a propriedade Images do tipo List<ProductImage>, geraremos a seguinte estrutura:
ββββββ¬βββββ¬ββββββββββββββββ¬βββββββββββββββββββββ¬βββββββββ¬βββββββββββ¬βββββββββββββββββ β PK β FK β Property name β Type β Length β Required β Auto-increment β ββββββΌβββββΌββββββββββββββββΌβββββββββββββββββββββΌβββββββββΌβββββββββββΌβββββββββββββββββ€ β x β β Id β Guid β β x β x β ββββββΌβββββΌββββββββββββββββΌβββββββββββββββββββββΌβββββββββΌβββββββββββΌβββββββββββββββββ€ β β β Name β string β 100 β x β β ββββββΌβββββΌββββββββββββββββΌβββββββββββββββββββββΌβββββββββΌβββββββββββΌβββββββββββββββββ€ β β β Description β string β 500 β x β β ββββββΌβββββΌββββββββββββββββΌβββββββββββββββββββββΌβββββββββΌβββββββββββΌβββββββββββββββββ€ β β β Price β decimal β β x β β ββββββΌβββββΌββββββββββββββββΌβββββββββββββββββββββΌβββββββββΌβββββββββββΌβββββββββββββββββ€ β β x β CategoryId β EntityId β β x β β ββββββΌβββββΌββββββββββββββββΌβββββββββββββββββββββΌβββββββββΌβββββββββββΌβββββββββββββββββ€ β β β Dimensions β ValueObject β β β β ββββββΌβββββΌββββββββββββββββΌβββββββββββββββββββββΌβββββββββΌβββββββββββΌβββββββββββββββββ€ β β β Status β Enum β β x β β ββββββΌβββββΌββββββββββββββββΌβββββββββββββββββββββΌβββββββββΌβββββββββββΌβββββββββββββββββ€ β β x β Images β List<ProductImage> β β β β ββββββ΄βββββ΄ββββββββββββββββ΄βββββββββββββββββββββ΄βββββββββ΄βββββββββββ΄βββββββββββββββββ
3.1 Criando a entidade ProductImage
Esta entidade pertence ao agregado Product e possui a seguinte estrutura:
ββββββ¬βββββ¬ββββββββββββββββ¬βββββββββββββββββ¬βββββββββ¬βββββββββββ¬βββββββββββββββββ β PK β FK β Property name β Type β Length β Required β Auto-increment β ββββββΌβββββΌββββββββββββββββΌβββββββββββββββββΌβββββββββΌβββββββββββΌβββββββββββββββββ€ β x β β Id β Guid β β x β x β ββββββΌβββββΌββββββββββββββββΌβββββββββββββββββΌβββββββββΌβββββββββββΌβββββββββββββββββ€ β β x β ProductId β EntityId β β x β β ββββββΌβββββΌββββββββββββββββΌβββββββββββββββββΌβββββββββΌβββββββββββΌβββββββββββββββββ€ β β β UploadDate β DateTimeOffset β β x β β ββββββΌβββββΌββββββββββββββββΌβββββββββββββββββΌβββββββββΌβββββββββββΌβββββββββββββββββ€ β β β Image β File β β x β β ββββββ΄βββββ΄ββββββββββββββββ΄βββββββββββββββββ΄βββββββββ΄βββββββββββ΄βββββββββββββββββ
4. Criando entidades para outros serviΓ§os
No serviΓ§o Sales, criamos a entidade ProductSnapshot, que serΓ‘ alimentada pelos eventos de integraΓ§Γ£o.
Como o Id original da entidade Product vem do serviΓ§o Catalog, ele nΓ£o pode ser auto-incremental aqui.
ββββββ¬βββββ¬ββββββββββββββββ¬ββββββββββ¬βββββββββ¬βββββββββββ¬βββββββββββββββββ β PK β FK β Property name β Type β Length β Required β Auto-increment β ββββββΌβββββΌββββββββββββββββΌββββββββββΌβββββββββΌβββββββββββΌβββββββββββββββββ€ β x β β Id β Guid β β x β β ββββββΌβββββΌββββββββββββββββΌββββββββββΌβββββββββΌβββββββββββΌβββββββββββββββββ€ β β β Name β string β 100 β x β β ββββββΌβββββΌββββββββββββββββΌββββββββββΌβββββββββΌβββββββββββΌβββββββββββββββββ€ β β β Price β decimal β β x β β ββββββ΄βββββ΄ββββββββββββββββ΄ββββββββββ΄βββββββββ΄βββββββββββ΄βββββββββββββββββ
ObservaΓ§Γ£o: apenas os campos essenciais foram replicados no ProductSnapshot para o serviΓ§o Sales. Entidades complementares, como Customer, Order e StockItem, nΓ£o serΓ£o detalhadas aqui para simplificar a documentaΓ§Γ£o.
Criando eventos e seus manipuladores
Recapitulando, no tΓ³pico anterior criamos no serviΓ§o modular Catalog.Merchandising as entidades Product, Category e ProductImage, enquanto no serviΓ§o Sales criamos a entidade ProductSnapshot.
Agora, vamos criar eventos de domΓnio e eventos de integraΓ§Γ£o. O objetivo Γ© que, ao criar ou atualizar produtos no serviΓ§o Catalog, essas alteraΓ§Γ΅es sejam replicadas para os serviΓ§os consumidores, como Sales e Stock.
1. Criando eventos de domΓnio
O primeiro passo Γ© criar os eventos de domΓnio ProductCreated e ProductUpdated com o comando:
lino event new
Durante a criaΓ§Γ£o, podemos associar o evento a um manipulador e, simultaneamente, configurar o disparo de um evento de integraΓ§Γ£o. Isso centraliza a criaΓ§Γ£o de todo o fluxo necessΓ‘rio.
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββ β Question β Answer β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ€ β Select a service: β Catalog β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ€ β Select a module: β Merchandising β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ€ β Select a entity: β Product β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ€ β Select the event type: β Domain Event β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ€ β Enter the name of the event: β ProductCreated β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ€ β Do you want to create an associated event handler? β Yes β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ€ β Trigger a integration event? β Yes β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ€ β Choose the integration event to be triggered: β (Create new integration event) β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ€ β Enter the name of the event: β ProductCreated β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ€ β Which model will be used for this integration event? β Creation model β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ΄βββββββββββββββββββββββββββββββββ
Da mesma forma, criamos o evento ProductUpdated:
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββ β Question β Answer β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ€ β Select a service: β Catalog β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ€ β Select a module: β Merchandising β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ€ β Select a entity: β Product β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ€ β Select the event type: β Domain Event β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ€ β Enter the name of the event: β ProductUpdated β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ€ β Do you want to create an associated event handler? β Yes β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ€ β Trigger a integration event? β Yes β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ€ β Choose the integration event to be triggered: β (Create new integration event) β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ€ β Enter the name of the event: β ProductUpdated β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ€ β Which model will be used for this integration event? β Update model β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ΄βββββββββββββββββββββββββββββββββ
Com isso, temos:
- Eventos de domΓnio criados (
ProductCreatedeProductUpdated); - Manipuladores de eventos de domΓnio correspondentes;
- Eventos de integraΓ§Γ£o registrados na Outbox automaticamente pelo manipulador de eventos de domΓnio.
2. Criando manipuladores de eventos de integraΓ§Γ£o
O prΓ³ximo passo Γ© definir quais serviΓ§os irΓ£o consumir os eventos de integraΓ§Γ£o. Para isso, usamos:
lino event-handler new
O fluxo de criaΓ§Γ£o envolve:
- Selecionar o serviΓ§o, mΓ³dulo e entidade que conterΓ‘ o manipulador;
- Selecionar o evento de integraΓ§Γ£o que serΓ‘ consumido e de qual serviΓ§o/mΓ³dulo/entidade ele virΓ‘.
Por exemplo, no serviΓ§o Sales criamos os manipuladores para ProductCreated e ProductUpdated que irΓ£o consumir os eventos disparados pelo Catalog.Merchandising.Product:
ββββββββββββββββββββββββββββββββββββββββββββββ¬ββββββββββββββββββββ β Question β Answer β ββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββ€ β Select a service: β Sales β ββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββ€ β Select a entity: β ProductSnapshot β ββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββ€ β Select the event type: β Integration Event β ββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββ€ β Select the event's service to be consumed: β Catalog β ββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββ€ β Select the event's module to be consumed: β Merchandising β ββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββ€ β Select the event's entity to be consumed: β Product β ββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββ€ β Choose the event to be consumed: β ProductCreated β ββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββ€ β Enter the name of the event handler: β ProductCreated β ββββββββββββββββββββββββββββββββββββββββββββββ΄ββββββββββββββββββββ
ββββββββββββββββββββββββββββββββββββββββββββββ¬ββββββββββββββββββββ β Question β Answer β ββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββ€ β Select a service: β Sales β ββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββ€ β Select a entity: β ProductSnapshot β ββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββ€ β Select the event type: β Integration Event β ββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββ€ β Select the event's service to be consumed: β Catalog β ββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββ€ β Select the event's module to be consumed: β Merchandising β ββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββ€ β Select the event's entity to be consumed: β Product β ββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββ€ β Choose the event to be consumed: β ProductUpdated β ββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββ€ β Enter the name of the event handler: β ProductUpdated β ββββββββββββββββββββββββββββββββββββββββββββββ΄ββββββββββββββββββββ
Com isso, temos dois manipuladores de eventos de integraΓ§Γ£o no serviΓ§o Sales, consumindo apenas os campos necessΓ‘rios dos eventos de integraΓ§Γ£o do Catalog.Merchandising. Isso garante que as tabelas replicadas mantenham apenas os dados essenciais, otimizando armazenamento e desempenho.
Gerando pΓ‘ginas web, APIs, Commands e Queries
Uma das grandes vantagens do Lino CLI Γ© permitir a criaΓ§Γ£o integrada de pΓ‘ginas web, APIs, Commands e Queries de forma automatizada, simplificando todo o fluxo de desenvolvimento. Para iniciar, basta executar o comando:
lino page new
Durante o processo, vocΓͺ irΓ‘:
- Selecionar o serviΓ§o, mΓ³dulo e entidade que deseja expor;
- Escolher os campos que farΓ£o parte da listagem;
- Gerar automaticamente pΓ‘ginas de listagem (grid paginado) e formulΓ‘rio de criaΓ§Γ£o/ediΓ§Γ£o;
- Gerar classes de HttpClient para consumo pelo frontend;
- Criar todas as APIs REST necessΓ‘rias (POST, PUT, PATCH, DELETE e GET);
- Criar Commands e Queries, com seus respectivos Handlers, que vΓ£o atΓ© o banco de dados garantindo o fluxo completo de CRUD.
Com esse comando, vocΓͺ obtΓ©m uma aplicaΓ§Γ£o funcional sem precisar escrever manualmente a camada de interface, APIs e lΓ³gica de negΓ³cio, mantendo o padrΓ£o e a consistΓͺncia entre serviΓ§os.
Para este projeto, podemos gerar as pΓ‘ginas integradas para as seguintes entidades:
- Catalog.Merchandising.
Category - Catalog.Merchandising.
Product - Sales.
ProductSnapshot
ApΓ³s gerar as pΓ‘ginas, APIs e Commands/Queries, a aplicaΓ§Γ£o estarΓ‘ pronta para interagir de forma completa entre frontend e backend, com validaΓ§Γ΅es, rotas e persistΓͺncia jΓ‘ configuradas automaticamente pelo Lino CLI.
Criando migraΓ§Γ΅es de bancos de dados
Agora que todas as entidades foram criadas, Γ© hora de gerar as migraΓ§Γ΅es para que os bancos de dados sejam criados ou atualizados conforme o modelo definido. O Lino CLI automatiza esse processo, integrando-se ao Entity Framework e criando scripts prontos para execuΓ§Γ£o.
Para criar uma nova migraΓ§Γ£o, execute o comando:
lino database migrations new
Durante a execuΓ§Γ£o, vocΓͺ precisarΓ‘:
- Selecionar o serviΓ§o e mΓ³dulo que receberΓ£o a migraΓ§Γ£o;
- Informar uma descriΓ§Γ£o para a migraΓ§Γ£o, por exemplo, "Initial migration".
βββββββββββββββββββββββββββββββββββββββββββββ¬ββββββββββββββββββββ β Question β Answer β βββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββ€ β Select a service: β Catalog β βββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββ€ β Select a module: β Merchandising β βββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββ€ β Current version of the service: β 0.1.0 β βββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββ€ β Provide a description for this migration: β Initial migration β βββββββββββββββββββββββββββββββββββββββββββββ΄ββββββββββββββββββββ
Ao confirmar, o Lino CLI irΓ‘ gerar:
- Uma nova migraΓ§Γ£o de banco de dados na versΓ£o atual do serviΓ§o;
- Um script SQL correspondente, localizado na camada Infrastructure.Persistence, no caminho /scripts/<version>/<nome do arquivo>;
- O registro da versΓ£o da migraΓ§Γ£o no histΓ³rico do serviΓ§o, garantindo rastreabilidade e consistΓͺncia.
Boas prΓ‘ticas:
- Crie novas migraΓ§Γ΅es sempre que houver alteraΓ§Γ΅es no modelo de dados (novas entidades, propriedades ou alteraΓ§Γ΅es de relacionamento);
- Revise os scripts SQL gerados antes de aplicar em produΓ§Γ£o;
- Mantenha o controle de versΓ£o da base de dados alinhado com a versΓ£o da aplicaΓ§Γ£o, evitando conflitos e problemas de sincronizaΓ§Γ£o.
Seguindo esse fluxo, vocΓͺ garante que o banco de dados esteja sempre atualizado e consistente com o modelo de domΓnio definido no Lino CLI, reduzindo erros e simplificando a manutenΓ§Γ£o.
Gerando imagens Docker
ApΓ³s concluir a geraΓ§Γ£o do cΓ³digo para uma versΓ£o especΓfica, realizar testes e implementar todas as regras de negΓ³cio necessΓ‘rias, vocΓͺ pode gerar imagens Docker dos serviΓ§os e aplicaΓ§Γ΅es web do seu projeto para posterior publicaΓ§Γ£o em um registro de contΓͺineres.
O Lino CLI simplifica esse processo com o comando:
lino build
Ao executar, vocΓͺ verΓ‘ uma lista de todos os serviΓ§os e aplicaΓ§Γ΅es web disponΓveis no projeto, juntamente com suas versΓ΅es atuais:
Select the services or web applications you want to include in the build:
> [ ] Services
[ ] Catalog |0.1.0|
[ ] Sales |0.1.0|
[ ] Security |0.1.0|
[ ] Stock |0.1.0|
[ ] Web applications
[ ] Backoffice |0.1.0|
VocΓͺ pode selecionar um ou mais serviΓ§os e aplicaΓ§Γ΅es web para gerar imagens simultaneamente. Basta marcar os itens desejados.
Em seguida, serΓ‘ solicitado escolher como deseja atualizar a versΓ£o das imagens geradas. As opΓ§Γ΅es disponΓveis sΓ£o:
- Manter a versΓ£o atual β nΓ£o altera a versΓ£o existente;
- Patch β incrementa a versΓ£o de patch (ex.: 0.1.0 β 0.1.1);
- Minor β incrementa a versΓ£o menor (ex.: 0.1.0 β 0.2.0);
- Major β incrementa a versΓ£o principal (ex.: 0.1.0 β 1.0.0).
ApΓ³s selecionar os serviΓ§os e definir o incremento de versΓ£o, o Lino CLI realiza:
- Build do cΓ³digo de cada serviΓ§o e aplicaΓ§Γ£o web;
- GeraΓ§Γ£o da imagem Docker correspondente;
- AplicaΓ§Γ£o da tag com a versΓ£o definida;
- DisponibilizaΓ§Γ£o das imagens para publicaΓ§Γ£o em seu registro de contΓͺineres.
Ao final do processo, considerando que todos os serviΓ§os e aplicaΓ§Γ΅es web foram selecionados, as imagens geradas terΓ£o a seguinte estrutura:
- my-app/services/catalog-host - tag: 0.1.0
- my-app/services/sales-api - tag: 0.1.0
- my-app/services/security-api - tag: 0.1.0
- my-app/services/stock-api - tag: 0.1.0
- my-app/webapps/backoffice - tag: 0.1.0
ObservaΓ§Γ£o: Esse processo garante consistΓͺncia entre o cΓ³digo e a versΓ£o das imagens Docker, facilitando o deploy e a manutenΓ§Γ£o de mΓΊltiplos ambientes, alΓ©m de permitir que cada serviΓ§o seja isolado em contΓͺineres independentes.
Criando versΓ΅es na aplicaΓ§Γ£o
Incrementar novas versΓ΅es aos serviΓ§os ou aplicaΓ§Γ΅es web Γ© um processo simples e centralizado no Lino CLI. Basta executar o comando:
lino version bump
Assim como na geraΓ§Γ£o de imagens Docker, ao executar esse comando vocΓͺ verΓ‘ uma lista completa de todos os serviΓ§os e aplicaΓ§Γ΅es web do seu projeto. Apenas os itens que vocΓͺ selecionar terΓ£o sua versΓ£o incrementada, enquanto os demais permanecerΓ£o inalterados.
Select the services or web applications that will have version changes:
> [ ] Services
[ ] Catalog |0.1.0|
[ ] Sales |0.1.0|
[ ] Security |0.1.0|
[ ] Stock |0.1.0|
[ ] Web applications
[ ] Backoffice |0.1.0|
ApΓ³s selecionar os itens desejados, vocΓͺ serΓ‘ solicitado a escolher o tipo de incremento de versΓ£o. As opΓ§Γ΅es disponΓveis sΓ£o:
- Patch β pequenas correΓ§Γ΅es sem impacto funcional;
- Minor β adiΓ§Γ£o de novas funcionalidades compatΓveis com versΓ΅es anteriores;
- Major β alteraΓ§Γ΅es que podem quebrar compatibilidade com versΓ΅es anteriores.
Γ importante destacar que as versΓ΅es dos serviΓ§os e aplicaΓ§Γ΅es web tΓͺm impacto direto em:
- As tags das imagens Docker;
- As pastas utilizadas para armazenar scripts gerados pelas migraΓ§Γ΅es de banco de dados;
- O controle de releases e histΓ³rico do projeto.
Com isso, concluΓmos o guia passo a passo de todos os comandos essenciais para a construΓ§Γ£o de um projeto web utilizando o Lino CLI, desde a instalaΓ§Γ£o, criaΓ§Γ£o de serviΓ§os, entidades, eventos e pΓ‘ginas, atΓ© a geraΓ§Γ£o de imagens Docker e versionamento.
NΓ£o deixe de acompanhar nosso canal no YouTube para acompanhar tutoriais detalhados, demonstraΓ§Γ΅es prΓ‘ticas e dicas de uso da ferramenta, desde operaΓ§Γ΅es simples atΓ© recursos avanΓ§ados.
