Omnia.AutoCodeGenerator
9.0.3
See the version list below for details.
dotnet tool install --global Omnia.AutoCodeGenerator --version 9.0.3
dotnet new tool-manifest
dotnet tool install --local Omnia.AutoCodeGenerator --version 9.0.3
#tool dotnet:?package=Omnia.AutoCodeGenerator&version=9.0.3
nuke :add-package Omnia.AutoCodeGenerator --version 9.0.3
ControllerGenerator
Generatore automatico di codice per creare Controller, Service, Repository e classi correlate basate su modelli Entity Framework.
Changelog
v9.0.3
- Fix: Prefix non viene più applicato ai modelli nei parametri generici delle interfacce. Ora il prefix tocca solo nomi di classi, interfacce e file, mentre i modelli nei generici mantengono il loro nome originale.
Installazione
Da NuGet (Raccomandato)
# Installa come CLI tool globale
dotnet tool install --global Omnia.AutoCodeGenerator
# Usa il comando
autocodegen -f "path/to/config.json"
Da Sorgente
# Clona il repository
git clone <repository-url>
cd ControllerGenerator
# Esegui direttamente
dotnet run -- -f "path/to/config.json"
Prerequisiti
- .NET 9.0 o superiore
- Modelli Entity Framework già generati
Utilizzo
Con CLI Tool (NuGet)
autocodegen -f <path-to-config.json>
Con Sorgente
dotnet run -- -f <path-to-config.json>
Esempio di Utilizzo
# Con CLI tool
autocodegen -f "C:\path\to\your\config.json"
autocodegen -f "..\TestAPI\CodeGenerator.json"
# Con sorgente
dotnet run -- -f "C:\path\to\your\config.json"
dotnet run -- -f "..\TestAPI\CodeGenerator.json"
Configurazione JSON
Il generatore utilizza un file di configurazione JSON per specificare i percorsi di input e output e le opzioni di generazione.
Esempio di Configurazione Completa
{
"NamespaceModels": "Test.Models",
"OverwriteExistingFiles": true,
"Prefix": "",
"RepositoryInterfaceGen": {
"InputModelsFolder": "C:\\...\\Test\\Models\\",
"OutputFolder": "C:\\...\\Test\\Generated\\Interfaces\\Repository\\",
"Namespace": "TestGenerated",
"Usings": ["InterfaceUtility.GenericInterfaces"]
},
"ServiceInterfaceGen": {
"InputModelsFolder": "C:\\...\\Test\\Models\\",
"OutputFolder": "C:\\...\\Test\\Generated\\Interfaces\\Service\\",
"Namespace": "TestGenerated",
"Usings": ["InterfaceUtility.GenericInterfaces"]
},
"UpperServiceInterfaceGen": {
"InputModelsFolder": "C:\\...\\Test\\Models\\",
"OutputFolder": "C:\\...\\Test\\Generated\\Interfaces\\UpperService\\",
"Namespace": "TestGenerated",
"Usings": ["InterfaceUtility.GenericInterfaces"]
},
"ServiceGen": {
"InputModelsFolder": "C:\\...\\Test\\Models\\",
"OutputFolder": "C:\\...\\Test\\Generated\\",
"Namespace": "TestGenerated",
"Usings": ["Utility.ServiceRepository"]
},
"ServiceBeforeGen": {
"InputModelsFolder": "C:\\...\\Test\\Models\\",
"OutputFolder": "C:\\...\\Test\\Generated\\",
"Namespace": "TestGenerated",
"Usings": ["InterfaceUtility.GenericInterfaces"]
},
"ServiceAfterGen": {
"InputModelsFolder": "C:\\...\\Test\\Models\\",
"OutputFolder": "C:\\...\\Test\\Generated\\",
"Namespace": "TestGenerated",
"Usings": ["InterfaceUtility.GenericInterfaces"]
},
"RepositoryGen": {
"InputModelsFolder": "C:\\...\\Test\\Models\\",
"OutputFolder": "C:\\...\\Test\\Generated\\",
"Namespace": "TestGenerated",
"Context": "TestContext",
"RepositoryBaseClass": "GenericRepository<Dummy, TestContext, Guid>",
"Usings": ["GenericImplementation.Service"]
},
"UpperServiceGen": {
"InputModelsFolder": "C:\\...\\Test\\Models\\",
"OutputFolder": "C:\\...\\Test\\Generated\\",
"Namespace": "TestGenerated",
"Usings": ["GenericImplementation.Service"]
},
"ControllerGen": {
"InputModelsFolder": "C:\\...\\Test\\Models\\",
"OutputFolder": "C:\\...\\TestAPI\\Controllers\\",
"Namespace": "TestGenerated",
"Usings": [
"InterfaceUtility.GenericInterfaces",
"Microsoft.AspNetCore.Authorization",
"Microsoft.AspNetCore.Mvc",
"Utility.GenericControllerImplementation"
]
},
"DependencyInjectionGen": {
"InputModelsFolder": "C:\\...\\Test\\Models\\",
"OutputFolder": "C:\\...\\TestAPI\\",
"Namespace": "TestGenerated",
"TypeDependency": "Scoped"
},
"SwaggerAuthenticationGen": {
"OutputFolder": "C:\\...\\TestAPI\\Extensions\\",
"Namespace": "TestGenerated"
}
}
Parametri di Configurazione
Parametri Globali
| Campo | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
NamespaceModels |
string | ✅ | Namespace dei modelli Entity Framework |
OverwriteExistingFiles |
bool | ❌ | Se true, sovrascrive i file esistenti. Default: false |
Prefix |
string | ❌ | Prefisso opzionale da aggiungere a tutti i file e alle classi generate. Utile per evitare conflitti di naming. |
Blocchi Generatori
Ogni blocco (es. ServiceGen, RepositoryGen, ControllerGen, ecc.) accetta:
| Campo | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
InputModelsFolder |
string | ✅ | Cartella contenente i modelli EF |
OutputFolder |
string | ✅ | Cartella di output per i file generati |
Namespace |
string | ✅ | Namespace per i file generati |
Usings |
string[] | ❌ | Array di usings da includere nei file |
Context |
string | Solo RepositoryGen | Nome della classe DbContext |
RepositoryBaseClass |
string | Solo RepositoryGen | Base class per i repository. Usare Dummy come placeholder per il modello (es. GenericRepository<Dummy, YourContext, Guid>). Con il prefix, Dummy verrà sostituito con il nome originale del modello (non prefissato). |
TypeDependency |
string | Solo DependencyInjectionGen | Tipo di dependency injection |
Note:
- I generatori di interfaccia (
RepositoryInterfaceGen,ServiceInterfaceGen,UpperServiceInterfaceGen) sono indipendenti e accettano solo i parametri comuni. - Nel parametro
RepositoryBaseClass, il placeholderDummyall'interno dei generici (es.<Dummy, Context>) viene sempre sostituito con il nome originale del modello, indipendentemente dal prefix. Questo garantisce che i tipi di base siano corretti anche quando si utilizza un prefix.
Gestione Sovrascrittura File
Il generatore supporta due modalità per la gestione dei file esistenti:
Modalità Default (Sicura)
{
"NamespaceModels": "YourProject.Models",
// OverwriteExistingFiles assente o false
}
- ✅ I file esistenti NON vengono sovrascritti
- ✅ Mostra
[SKIP] filename.cs esiste già. - ✅ Sicuro per le modifiche manuali
Modalità Sovrascrittura
{
"NamespaceModels": "YourProject.Models",
"OverwriteExistingFiles": true
}
- ⚠️ I file esistenti VENGONO sovrascritti
- ⚠️ Mostra
[OVERWRITE] filename.cs sovrascritto. - ⚠️ Le modifiche manuali verranno perse
Utilizzo del Prefix
Il campo Prefix opzionale consente di aggiungere un prefisso a tutti i file e alle classi generate, utile per evitare conflitti di naming quando si utilizzano più domini o versioni.
Esempio di Configurazione con Prefix
{
"NamespaceModels": "YourProject.Models",
"Prefix": "Luca",
"RepositoryGen": {
"InputModelsFolder": "C:\\...\\Models\\",
"OutputFolder": "C:\\...\\Generated\\",
"Namespace": "YourProject.Generated",
"Context": "YourContext",
"RepositoryBaseClass": "GenericRepository<Dummy, YourContext, Guid>",
"Usings": ["GenericImplementation.Service"]
}
}
Output con Prefix
Con il modello User.cs e Prefix: "Luca", verranno generati:
File generati:
LucaUserRepository.cs(classeLucaUserRepository)ILucaUserRepository.cs(interfacciaILucaUserRepository)LucaUserService.cs(classeLucaUserService)ILucaUserService.cs(interfacciaILucaUserService)LucaUserController.cs(classeLucaUserController)- etc.
Registrazioni DI (in DependencyInjectionExtensions.cs):
services.AddScoped<ILucaUserRepository, LucaUserRepository>();
services.AddScoped<ILucaUserService, LucaUserService>();
services.AddScoped<ILucaUserUpperService, LucaUserUpperService>();
Senza Prefix (Comportamento Default)
Omettendo il campo Prefix o impostandolo a null:
File generati:
UserRepository.cs(classeUserRepository)IUserRepository.cs(interfacciaIUserRepository)UserService.cs(classeUserService)- etc.
Registrazioni DI:
services.AddScoped<IUserRepository, UserRepository>();
services.AddScoped<IUserService, UserService>();
services.AddScoped<IUserUpperService, UserUpperService>();
Note sul Prefix:
- ✅ Viene applicato a tutti i file generati (Repository, Service, Controller, etc.)
- ✅ Viene applicato alle classi e alle interfacce
- ✅ Mantiene la convenzione C# per le interfacce (es.
ILucaUserRepository) - ✅ Viene applicato anche alle registrazioni nel file DI
- ✅ Per i Repository, il prefix viene applicato ai nomi delle classi, ma il parametro generico della base class mantiene il nome originale del modello (es.
GenericRepository<User, ...>e nonGenericRepository<LucaUser, ...>) - ✅ È opzionale e retrocompatibile
Messaggi di Output
Durante l'esecuzione, il generatore mostra messaggi informativi:
[CREATE] filename.cs creato.- Nuovo file creato[SKIP] filename.cs esiste già.- File esistente non sovrascritto[OVERWRITE] filename.cs sovrascritto.- File esistente sovrascritto
Struttura File Generati
Per ogni modello Customer, il generatore crea:
Controllers
CustomerController.cs
Services
// Interfaces
ICustomerService.cs
ICustomerServiceBefore.cs
ICustomerServiceAfter.cs
ICustomerUpperService.cs
// Implementations
CustomerService.cs
CustomerUpperService.cs
Repositories
// Interface
ICustomerRepository.cs
// Implementation
CustomerRepository.cs
Interfacce Generiche
// RepositoryInterfaceGen
ICustomerRepository.cs
// ServiceInterfaceGen
ICustomerService.cs
// UpperServiceInterfaceGen
ICustomerUpperService.cs
Extensions (SwaggerAuthenticationGen)
SwaggerAuthenticationExtensions.cs
Contiene i seguenti extension methods:
AddSwaggerWithAuthentication()- Configura Swagger/OpenAPI con JWT BearerAddPermissiveAuthentication()- Autenticazione permissiva per sviluppoUseSwaggerWithUI()- Configura Swagger UI personalizzabile
Esempio di utilizzo in Program.cs:
// Aggiungi servizi
builder.Services.AddSwaggerWithAuthentication(
title: "My API",
version: "v1",
description: "API Documentation"
);
builder.Services.AddPermissiveAuthentication();
// Configura pipeline
app.UseSwaggerWithUI(
title: "My API Documentation",
version: "v1",
routePrefix: "" // Swagger alla radice
);
app.UseAuthentication();
app.UseAuthorization();
Esempio Pratico
- Preparare i modelli EF in una cartella (es.
Models/) - Creare il file di configurazione
config.json - Eseguire il generatore:
dotnet run -- -f config.json - Verificare i file generati nelle cartelle specificate
Note Importanti
- Il generatore esclude automaticamente i file che contengono "Context" nel nome
- Tutti i percorsi devono essere assoluti
- Le cartelle di output vengono create automaticamente se non esistono
- La compatibilità è garantita con file JSON esistenti (retrocompatibile)
Risoluzione Problemi
Errore: "File non trovato"
Verificare che il percorso del file JSON sia corretto e accessibile.
Errore: "Campo XXX non può essere nullo"
Verificare che tutti i campi obbligatori siano presenti nel JSON.
File non generati
Verificare che:
- La cartella dei modelli contenga file .cs
- I percorsi di output siano scrivibili
- Non ci siano conflitti di permessi
Help
Per visualizzare l'help:
dotnet run -- --help
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
This package has no dependencies.
README aggiornato e verificato, esempi CLI e JSON completi, documentazione SwaggerAuthenticationGen inclusa. Versione 1.1.1.