Da zero alla build: guida passo passo
Questo argomento presenta una guida pratica e passo passo per utilizzare Lino CLI come strumento principale nella costruzione di un progetto: dall'installazione e configurazione iniziale, passando per la generazione di servizi, moduli ed entitร , fino a funzionalitร avanzate come eventi, lavori in background, migrazioni, build di immagini Docker e versionamento.
L'obiettivo รจ mostrare in modo integrato come i comandi del CLI si inseriscono nel flusso di sviluppo reale โ non solo elencarli, ma spiegare il motivo di ogni scelta, cosa viene generato automaticamente e quali sono le implicazioni architetturali.
Anche se ogni comando ha giร una documentazione specifica, qui vedrai il processo end-to-end โ un percorso riproducibile che fa risparmiare ore di lavoro ripetitivo e aiuta a mantenere un codice coerente e testabile.
Nel corso della guida spiegheremo concetti tecnici applicati da Lino (es.: CQRS, TypedResults, Source Generators, Outbox Pattern), mostreremo esempi di comandi e indicheremo le migliori pratiche per versionamento, deploy e integrazione continua.
Installazione e configurazione di Lino CLI
Il primo passo per iniziare a lavorare con Lino CLI รจ installare lo strumento nel proprio ambiente di sviluppo. Viene distribuito come dotnet global tool, il che significa che sarร disponibile per qualsiasi progetto .NET sul tuo computer.
Passo 1: Installazione
Per installare (o aggiornare) Lino CLI, esegui il seguente comando nel terminale:
dotnet tool install --global Tolitech.Lino
Note importanti:
- Se รจ giร installata una versione, puoi usare
dotnet tool update --global Tolitech.Linoper aggiornarla. - Assicurati che la directory degli strumenti globali di .NET sia nel
PATHdel sistema, affinchรฉ il comandolinofunzioni correttamente.
Passo 2: Configurare la lingua
Dopo l'installazione, si consiglia di configurare la lingua (o cultura) che il CLI utilizzerร per messaggi, prompt e log:
lino preferences culture set
Ti verrร chiesto di scegliere tra le lingue disponibili. Questa configurazione garantisce che tutte le istruzioni e i prompt vengano visualizzati in modo coerente nella lingua desiderata.
Passo 3: Autenticazione e registrazione
Per accedere a tutte le funzionalitร di Lino, inclusi template avanzati, pubblicazione di immagini Docker e integrazione con servizi esterni, รจ necessario essere autenticati.
- Se non possiedi ancora un account, registrati con il comando:
lino user register
- Se hai giร un account, effettua il login con:
lino auth login
Cosa succede: il CLI memorizza localmente un token di autenticazione, permettendoti di eseguire comandi che richiedono accesso a risorse protette senza dover effettuare il login ogni volta.
Passo 4: Verifica
Per confermare che l'installazione e l'autenticazione siano state eseguite correttamente, esegui:
lino --version
Se il comando restituisce la versione installata, sei pronto per iniziare a utilizzare Lino CLI nei tuoi progetti.
Creazione del progetto MyApp
In questo passaggio, creeremo la struttura iniziale del progetto utilizzando Lino CLI. Questo progetto servirร come base per dimostrare la creazione di servizi, moduli, front-end e l'integrazione degli eventi.
Passo 1: Esecuzione del comando di creazione
Per creare un nuovo progetto, eseguire il seguente comando nel terminale:
lino project new
Il CLI ti guiderร passo passo, richiedendo informazioni come:
- Nome del progetto: useremo
MyApp, ma puoi scegliere qualsiasi nome tu voglia; - Funzionalitร aggiuntive: analizzatori di codice, cache distribuita, supporto per eventi asincroni, ecc.
Passo 2: Configurazione delle funzionalitร principali
Per questo progetto, consigliamo di abilitare fin dall'inizio le seguenti funzionalitร :
- Analizzatori di codice: per garantire che il codice segua le migliori pratiche e standard coerenti, prevenendo errori comuni di implementazione;
- Cache distribuita: migliora le prestazioni dell'applicazione in scenari con piรน servizi, evitando query non necessarie al database;
- Comunicazione asincrona: abilita l'uso di eventi e code per l'integrazione tra servizi, garantendo scalabilitร e disaccoppiamento.
ร importante abilitare tutte queste opzioni in questo progetto, poichรฉ creeremo piรน servizi che comunicheranno tra loro tramite eventi di integrazione. Questo ti permetterร di comprendere come strutturare sistemi modulari e distribuiti utilizzando Lino.
Passo 3: Struttura generata
Dopo aver eseguito il comando e configurato le funzionalitร , il CLI genererร la struttura iniziale del progetto. Essa includerร :
- Cartelle per servizi e moduli;
- Template per il front-end (se applicabile);
- Configurazioni iniziali per cache, eventi e integrazioni;
- File di soluzione (.slnx) e progetto (.csproj) pronti per la compilazione.
Ora il tuo progetto MyApp รจ pronto per ricevere i servizi, moduli, entitร e front-end che configureremo nei passaggi successivi.
Aggiunta del frontend
Ora andiamo a creare lโinterfaccia del sistema, il frontend, che sarร utilizzato come Backoffice. Questo frontend non sarร unโapplicazione pubblica, ma uno strumento interno affinchรฉ amministratori e responsabili possano gestire prodotti, categorie, inventari, vendite e altre informazioni del sistema.
Passo 1: Esecuzione del comando di creazione
Per aggiungere un nuovo frontend al progetto, utilizza il seguente comando nel terminale:
lino webapp new
Durante il processo la CLI richiederร alcune informazioni, come ad esempio:
- Nome dellโapplicazione web: in questo esempio useremo
Backoffice;
Passo 2: Struttura generata
Al termine del processo, la CLI genererร la struttura iniziale del frontend allโinterno della cartella WebApps/Backoffice.
La struttura predefinita include:
- Cartelle per pagine, componenti e servizi dellโapplicazione;
- Client HTTP per consumare le API dei servizi del progetto;
- Template iniziali;
- File di configurazione per lโintegrazione con autenticazione, autorizzazione ed eventi del sistema.
Note importanti
- Il frontend sarร automaticamente integrato con i servizi e i moduli selezionati, consentendo di consumare direttamente i dati di prodotti, categorie e vendite tramite le API generate da Lino.
- ร possibile creare piรน frontend, ad esempio uno per gli amministratori (Backoffice) e un altro pubblico (Sito), seguendo lo stesso processo.
Con il frontend creato, siamo pronti a procedere con la creazione dei servizi e dei moduli che forniranno i dati e le regole di business per questa applicazione.
Creazione di servizi e moduli
In questa fase costruiremo i servizi e i moduli che comporranno l'applicazione. L'obiettivo รจ creare un'architettura modulare e scalabile, permettendo alle diverse aree del sistema, come prodotti, categorie, magazzino, vendite e media, di evolvere in modo indipendente, mantenendo coesione e facilitando la manutenzione.
Passo 1: Definizione dei servizi
Inizialmente, creeremo i seguenti servizi, ciascuno con responsabilitร ben definite:
- Catalog (modulare) โ responsabile della gestione di prodotti, categorie e prezzi;
- Sales โ responsabile dell'elaborazione di vendite e ordini;
- Stock โ responsabile della gestione degli stock e dei movimenti;
- Security โ responsabile dell'autenticazione, autorizzazione e gestione utenti.
Per creare un nuovo servizio, eseguire il comando:
lino service new
Durante l'esecuzione del comando, il CLI richiederร :
- Nome del servizio: ad esempio,
Catalog; - Database: scegli la tecnologia piรน adatta al tuo progetto (SQL Server, PostgreSQL, ecc.);
Passo 2: Creazione di moduli all'interno dei servizi
Non tutti i servizi devono essere modulari. Nel nostro progetto, solo il servizio Catalog avrร moduli, per separare responsabilitร come merchandising e pricing.
Abbiamo definito per il servizio Catalog i seguenti moduli:
- Merchandising โ gestione di prodotti e categorie;
- Pricing โ gestione dei prezzi, promozioni e storico delle modifiche.
Per creare un modulo, eseguire il comando:
lino module new
ร possibile creare quanti moduli si desidera all'interno del servizio modulare Catalog. Inoltre, a seconda della complessitร , alcuni moduli potrebbero diventare servizi indipendenti in futuro. La separazione mostrata qui รจ solo a scopo didattico ed รจ un esempio di organizzazione modulare.
Struttura finale del progetto
Dopo la creazione dei servizi e dei moduli, la soluzione dovrebbe avere una struttura simile alla seguente:
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/
Spiegazione della struttura:
Services/: contiene tutti i servizi del sistema, ciascuno isolato con propria logica di business, infrastruttura e hosting;Modules/: cartelle all'interno dei servizi modulari, per organizzare funzionalitร specifiche e mantenere il codice coeso;WebApps/: frontend associati al sistema, giร integrati con i servizi;Shared/: librerie e risorse condivise tra servizi e frontend;tests/: test unitari e di integrazione organizzati per servizio e modulo.
Con questa struttura modulare, ogni team o sviluppatore puรฒ lavorare in modo indipendente su diverse parti del sistema, facilitando scalabilitร , manutenzione e test.
Aggiunta di autenticazione e autorizzazione
L'autenticazione e l'autorizzazione sono elementi essenziali di qualsiasi sistema moderno. In Lino CLI, aggiungerle al progetto รจ semplice e veloce.
Passo 1: Esecuzione del comando di autenticazione
Per aggiungere le funzionalitร di autenticazione e autorizzazione, utilizza il comando:
lino features auth add
Il CLI ti guiderร attraverso i seguenti passaggi:
- Scelta del servizio o modulo: devi indicare dove verranno installati gli artefatti di autenticazione. Nel nostro progetto di esempio, utilizziamo il servizio Security, che centralizza tutta la logica di sicurezza del sistema;
- Configurazioni aggiuntive: creazione di tabelle per utenti, ruoli e permessi e impostazione delle politiche di accesso.
Passo 2: Struttura generata
Dopo lโesecuzione del comando, il servizio Security conterrร file e cartelle come:
- Entities: classi per utenti, ruoli e permessi;
- Infrastructure: configurazioni del database e migrazioni per creare le tabelle;
- Application: servizi di autenticazione, gestione utenti e validazione delle credenziali;
- API/Host: endpoint per login, logout, registrazione e gestione dei ruoli.
Con questa configurazione, la tua applicazione avrร unโautenticazione robusta e un controllo granulare degli accessi, pronta a supportare piรน utenti e differenti livelli di permessi.
Aggiunta di Background Jobs
Nei sistemi distribuiti e modulari, come quello che stiamo costruendo con il Lino CLI, non tutti i servizi comunicano direttamente tra loro. Per garantire coerenza e affidabilitร nello scambio di informazioni, utilizziamo eventi di integrazione. Tuttavia, per elaborare questi eventi in modo efficiente e asincrono, abbiamo bisogno dei Background Jobs.
Lino utilizza il Outbox Pattern per garantire che tutti i messaggi generati dai servizi vengano registrati in modo affidabile prima dellโinvio. In questo modo possiamo:
- Evitarne la perdita in caso di errori o riavvii del servizio;
- Garantire che lo stesso messaggio venga inviato una sola volta;
- Consentire il rielaborazione dei messaggi in caso di errore nella consegna;
- Separare lโelaborazione degli eventi dalla logica principale dellโapplicazione, migliorando prestazioni e scalabilitร .
Passo 1: Esecuzione del comando
Per aggiungere il supporto ai Background Jobs nel tuo progetto, esegui il comando:
lino features background-job add
Il CLI ti chiederร di selezionare il servizio in cui verrร installato il Background Job. Di solito sceglierai il servizio che centralizza la produzione degli eventi, come Catalog o Sales.
Passo 2: Configurazione dellโesecuzione
Durante la configurazione, puoi definire:
- Intervallo di controllo: determina la frequenza con cui il Background Job controllerร la tabella Outbox per nuovi messaggi. Un intervallo troppo breve puรฒ aumentare lโutilizzo delle risorse, mentre un intervallo lungo puรฒ ritardare la consegna degli eventi;
- Dimensione del batch di record processati per volta: controlla quanti eventi verranno letti e inviati per ogni esecuzione. Batch piรน grandi possono migliorare le prestazioni, ma richiedono piรน memoria e potenza di calcolo;
- Politica di retry: in caso di fallimento nellโinvio dei messaggi, puoi configurare quante volte il job tenterร di reinviare.
Questi parametri dipendono dalla dimensione del sistema, dalla capacitร della macchina e dal volume previsto di eventi.
Passo 3: Struttura generata
Dopo la configurazione, il progetto avrร un Background Job pronto per elaborare i messaggi delle tabelle Outbox in ciascun servizio.
In questo modo si garantisce che tutti gli eventi di integrazione vengano processati in modo affidabile ed efficiente, consentendo a piรน servizi e moduli di comunicare in modo asincrono senza influire sulle prestazioni del sistema principale.
Creazione di entitร e enumerazioni
In questa sezione, descriviamo nel dettaglio il design delle entitร , delle enumerazioni e degli oggetti di valore dell'applicazione, mostrando in quali servizi e moduli verrร creato ciascun elemento.
1. Creazione dell'entitร Category
Per creare l'entitร , utilizzare il comando:
lino entity new
L'entitร verrร creata nel servizio Catalog e nel modulo Merchandising con la seguente struttura:
โโโโโโฌโโโโโฌโโโโโโโโโโโโโโโโฌโโโโโโโโโฌโโโโโโโโโฌโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโ โ PK โ FK โ Property name โ Type โ Length โ Required โ Auto-increment โ โโโโโโผโโโโโผโโโโโโโโโโโโโโโโผโโโโโโโโโผโโโโโโโโโผโโโโโโโโโโโผโโโโโโโโโโโโโโโโโค โ x โ โ Id โ Guid โ โ x โ x โ โโโโโโผโโโโโผโโโโโโโโโโโโโโโโผโโโโโโโโโผโโโโโโโโโผโโโโโโโโโโโผโโโโโโโโโโโโโโโโโค โ โ โ Name โ string โ 50 โ x โ โ โโโโโโดโโโโโดโโโโโโโโโโโโโโโโดโโโโโโโโโดโโโโโโโโโดโโโโโโโโโโโดโโโโโโโโโโโโโโโโโ
2. Creazione dell'entitร Product
Successivamente, creiamo l'entitร Product nello stesso servizio e modulo, includendo oggetti di valore ed enumerazioni:
โโโโโโฌโโโโโฌโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโฌโโโโโโโโโฌโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโ โ 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 Creazione dell'oggetto di valore ProductDimension
Questo oggetto di valore rappresenta le dimensioni del prodotto:
โโโโโโโโโโโโโโโโโฌโโโโโโโโโโฌโโโโโโโโโฌโโโโโโโโโโโ โ Property name โ Type โ Length โ Required โ โโโโโโโโโโโโโโโโโผโโโโโโโโโโผโโโโโโโโโผโโโโโโโโโโโค โ Width โ decimal โ โ x โ โโโโโโโโโโโโโโโโโผโโโโโโโโโโผโโโโโโโโโผโโโโโโโโโโโค โ Height โ decimal โ โ x โ โโโโโโโโโโโโโโโโโผโโโโโโโโโโผโโโโโโโโโผโโโโโโโโโโโค โ Depth โ decimal โ โ x โ โโโโโโโโโโโโโโโโโดโโโโโโโโโโดโโโโโโโโโดโโโโโโโโโโโ
2.2 Creazione dell'enum ProductStatus
Questo enum definisce lo stato del prodotto:
โโโโโโโโโฌโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโ โ Value โ Name โ Display Name โ โโโโโโโโโผโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโค โ 1 โ Active โ Active โ โโโโโโโโโผโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโค โ 2 โ Inactive โ Inactive โ โโโโโโโโโผโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโค โ 3 โ Discontinued โ Discontinued โ โโโโโโโโโดโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโ
3. Aggiunta di nuove proprietร
Con l'evoluzione del progetto, possiamo modificare le entitร esistenti per aggiungere nuove proprietร .
Ad esempio, aggiungeremo un elenco di immagini all'entitร Product:
lino entity edit
Creando la proprietร Images di tipo List<ProductImage>, otterremo la seguente struttura:
โโโโโโฌโโโโโฌโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโฌโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโ โ 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 Creazione dell'entitร ProductImage
Questa entitร appartiene all'aggregato Product e ha la seguente struttura:
โโโโโโฌโโโโโฌโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโฌโโโโโโโโโฌโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโ โ 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. Creazione di entitร per altri servizi
Nel servizio Sales, creiamo l'entitร ProductSnapshot, che sarร popolata dagli eventi di integrazione.
Poichรฉ l'Id originale dell'entitร Product proviene dal servizio Catalog, qui non puรฒ essere auto-incrementale.
โโโโโโฌโโโโโฌโโโโโโโโโโโโโโโโฌโโโโโโโโโโฌโโโโโโโโโฌโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโ โ PK โ FK โ Property name โ Type โ Length โ Required โ Auto-increment โ โโโโโโผโโโโโผโโโโโโโโโโโโโโโโผโโโโโโโโโโผโโโโโโโโโผโโโโโโโโโโโผโโโโโโโโโโโโโโโโโค โ x โ โ Id โ Guid โ โ x โ โ โโโโโโผโโโโโผโโโโโโโโโโโโโโโโผโโโโโโโโโโผโโโโโโโโโผโโโโโโโโโโโผโโโโโโโโโโโโโโโโโค โ โ โ Name โ string โ 100 โ x โ โ โโโโโโผโโโโโผโโโโโโโโโโโโโโโโผโโโโโโโโโโผโโโโโโโโโผโโโโโโโโโโโผโโโโโโโโโโโโโโโโโค โ โ โ Price โ decimal โ โ x โ โ โโโโโโดโโโโโดโโโโโโโโโโโโโโโโดโโโโโโโโโโดโโโโโโโโโดโโโโโโโโโโโดโโโโโโโโโโโโโโโโโ
Nota: solo i campi essenziali sono stati replicati in ProductSnapshot per il servizio Sales. Entitร aggiuntive come Customer, Order e StockItem non saranno dettagliate qui per semplificare la documentazione.
Creazione di eventi e relativi gestori
Ricapitolando, nella sezione precedente abbiamo creato nel servizio modulare Catalog.Merchandising le entitร Product, Category e ProductImage, mentre nel servizio Sales abbiamo creato l'entitร ProductSnapshot.
Ora creeremo eventi di dominio ed eventi di integrazione. L'obiettivo รจ che, quando vengono creati o aggiornati prodotti nel servizio Catalog, queste modifiche vengano replicate ai servizi consumatori come Sales e Stock.
1. Creazione di eventi di dominio
Il primo passo รจ creare gli eventi di dominio ProductCreated e ProductUpdated con il comando:
lino event new
Durante la creazione, รจ possibile associare l'evento a un gestore e contemporaneamente configurare il trigger di un evento di integrazione. Questo centralizza la creazione dell'intero flusso necessario.
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ 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 โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Allo stesso modo, creiamo l'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 โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Con questo, otteniamo:
- Eventi di dominio creati (
ProductCreatedeProductUpdated); - Gestori di eventi di dominio corrispondenti;
- Eventi di integrazione registrati automaticamente nell'Outbox dal gestore degli eventi di dominio.
2. Creazione dei gestori degli eventi di integrazione
Il passo successivo รจ definire quali servizi consumeranno gli eventi di integrazione. Per farlo, utilizziamo:
lino event-handler new
Il flusso di creazione prevede:
- Selezionare il servizio, il modulo e l'entitร che conterrร il gestore;
- Selezionare l'evento di integrazione da consumare e da quale servizio/modulo/entitร proviene.
Ad esempio, nel servizio Sales creiamo i gestori per ProductCreated e ProductUpdated che consumeranno gli eventi emessi da 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 โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโ
In questo modo, abbiamo due gestori di eventi di integrazione nel servizio Sales, che consumano solo i campi necessari dagli eventi di integrazione provenienti da Catalog.Merchandising. Questo assicura che le tabelle replicate contengano solo i dati essenziali, ottimizzando spazio e prestazioni.
Generazione di pagine web, API, Commands e Queries
Uno dei grandi vantaggi di Lino CLI รจ la possibilitร di creare in modo integrato pagine web, API, Commands e Queries automaticamente, semplificando lโintero flusso di sviluppo. Per iniziare, basta eseguire il comando:
lino page new
Durante il processo, eseguirai le seguenti operazioni:
- Selezionare il servizio, il modulo e lโentitร da esporre;
- Scegliere i campi che faranno parte della lista;
- Generare automaticamente le pagine di elenco (griglia con paginazione) e i form di creazione/modifica;
- Generare le classi HttpClient per lโuso nel frontend;
- Creare tutte le API REST necessarie (POST, PUT, PATCH, DELETE e GET);
- Creare Commands e Queries con i rispettivi Handlers, che interagiscono con il database garantendo il flusso completo di CRUD.
Con questo comando, ottieni unโapplicazione funzionante senza dover scrivere manualmente il layer di interfaccia, le API e la logica di business, mantenendo standard e coerenza tra i servizi.
Per questo progetto, possiamo generare pagine integrate per le seguenti entitร :
- Catalog.Merchandising.
Category - Catalog.Merchandising.
Product - Sales.
ProductSnapshot
Dopo aver generato pagine, API e Commands/Queries, lโapplicazione sarร pronta per interagire completamente tra frontend e backend, con validazioni, rotte e persistenza giร configurate automaticamente da Lino CLI.
Creazione delle migrazioni del database
Ora che tutte le entitร sono state create, รจ il momento di generare le migrazioni affinchรฉ i database vengano creati o aggiornati secondo il modello definito. Lino CLI automatizza questo processo, integrandosi con Entity Framework e creando script pronti allโesecuzione.
Per creare una nuova migrazione, eseguire il comando:
lino database migrations new
Durante lโesecuzione, sarร necessario:
- Selezionare il servizio e il modulo che riceveranno la migrazione;
- Fornire una descrizione per la migrazione, ad esempio "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 โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโ
Dopo la conferma, Lino CLI genererร :
- Una nuova migrazione del database per la versione corrente del servizio;
- Uno script SQL corrispondente, posizionato nel layer Infrastructure.Persistence, nel percorso /scripts/<version>/<nome file>;
- La registrazione della versione della migrazione nella cronologia del servizio, garantendo tracciabilitร e coerenza.
Buone pratiche:
- Creare nuove migrazioni ogni volta che il modello dei dati cambia (nuove entitร , proprietร o modifiche alle relazioni);
- Revisionare gli script SQL generati prima di applicarli in produzione;
- Mantenere il controllo di versione del database allineato con la versione dellโapplicazione, evitando conflitti e problemi di sincronizzazione.
Seguendo questo flusso, si garantisce che il database sia sempre aggiornato e coerente con il modello di dominio definito in Lino CLI, riducendo errori e semplificando la manutenzione.
Generazione di immagini Docker
Dopo aver completato la generazione del codice per una versione specifica, effettuato i test e implementato tutte le regole di business necessarie, รจ possibile generare immagini Docker per i servizi e le applicazioni web del progetto, da pubblicare successivamente in un registro di container.
Lino CLI semplifica questo processo con il comando:
lino build
Durante lโesecuzione, vedrete un elenco di tutti i servizi e le applicazioni web disponibili nel progetto, insieme alle loro versioni correnti:
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|
Potete selezionare uno o piรน servizi e applicazioni web per generare le immagini simultaneamente, semplicemente contrassegnando gli elementi desiderati.
Successivamente, vi verrร chiesto come aggiornare la versione delle immagini generate. Le opzioni disponibili sono:
- Mantieni la versione corrente โ non modifica la versione esistente;
- Patch โ incrementa la versione patch (es.: 0.1.0 โ 0.1.1);
- Minor โ incrementa la versione minor (es.: 0.1.0 โ 0.2.0);
- Major โ incrementa la versione major (es.: 0.1.0 โ 1.0.0).
Dopo aver selezionato i servizi e definito lโincremento di versione, Lino CLI esegue:
- Build del codice di ogni servizio e applicazione web;
- Generazione dellโimmagine Docker corrispondente;
- Applicazione del tag con la versione definita;
- Rendere le immagini disponibili per la pubblicazione nel vostro registro di container.
Al termine del processo, considerando che tutti i servizi e applicazioni web siano stati selezionati, le immagini generate avranno la seguente struttura:
- 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
Nota: Questo processo garantisce coerenza tra il codice e la versione delle immagini Docker, facilitando il deploy e la manutenzione di piรน ambienti, oltre a permettere che ogni servizio sia isolato in container indipendenti.
Creazione delle versioni nellโapplicazione
Incrementare nuove versioni per i servizi o le applicazioni web รจ un processo semplice e centralizzato in Lino CLI. Basta eseguire il comando:
lino version bump
Come per la generazione delle immagini Docker, eseguendo questo comando vedrete un elenco completo di tutti i servizi e le applicazioni web del progetto. Solo gli elementi selezionati avranno la versione incrementata, mentre gli altri rimarranno invariati.
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|
Dopo aver selezionato gli elementi desiderati, vi verrร chiesto di scegliere il tipo di incremento della versione. Le opzioni disponibili sono:
- Patch โ piccole correzioni senza impatto funzionale;
- Minor โ aggiunta di nuove funzionalitร compatibili con le versioni precedenti;
- Major โ modifiche che possono rompere la compatibilitร con le versioni precedenti.
ร importante notare che le versioni dei servizi e delle applicazioni web hanno un impatto diretto su:
- I tag delle immagini Docker;
- Le cartelle utilizzate per memorizzare gli script generati dalle migrazioni del database;
- Il controllo delle release e la cronologia del progetto.
Con questo, concludiamo la guida passo passo a tutti i comandi essenziali per la costruzione di un progetto web utilizzando Lino CLI, dallโinstallazione, creazione di servizi, entitร , eventi e pagine, fino alla generazione di immagini Docker e al versionamento.
Non dimenticate di seguire il nostro canale YouTube per tutorial dettagliati, dimostrazioni pratiche e suggerimenti sullโuso dello strumento, dalle operazioni di base alle funzionalitร avanzate.
