Omnia.AutoCodeGenerator 9.0.3

There is a newer version of this package available.
See the version list below for details.
dotnet tool install --global Omnia.AutoCodeGenerator --version 9.0.3
                    
This package contains a .NET tool you can call from the shell/command line.
dotnet new tool-manifest
                    
if you are setting up this repo
dotnet tool install --local Omnia.AutoCodeGenerator --version 9.0.3
                    
This package contains a .NET tool you can call from the shell/command line.
#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 placeholder Dummy all'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 (classe LucaUserRepository)
  • ILucaUserRepository.cs (interfaccia ILucaUserRepository)
  • LucaUserService.cs (classe LucaUserService)
  • ILucaUserService.cs (interfaccia ILucaUserService)
  • LucaUserController.cs (classe LucaUserController)
  • 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 (classe UserRepository)
  • IUserRepository.cs (interfaccia IUserRepository)
  • UserService.cs (classe UserService)
  • 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 non GenericRepository<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 Bearer
  • AddPermissiveAuthentication() - Autenticazione permissiva per sviluppo
  • UseSwaggerWithUI() - 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

  1. Preparare i modelli EF in una cartella (es. Models/)
  2. Creare il file di configurazione config.json
  3. Eseguire il generatore:
    dotnet run -- -f config.json
    
  4. 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 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

This package has no dependencies.

Version Downloads Last Updated
9.0.5 82 2/26/2026
9.0.4 77 2/26/2026
9.0.3 77 2/26/2026
9.0.2 80 2/26/2026
9.0.1 79 2/26/2026
9.0.0 102 1/9/2026
1.1.1 351 11/17/2025
1.1.0 203 10/20/2025
1.0.1 330 9/16/2025
1.0.0 324 9/16/2025

README aggiornato e verificato, esempi CLI e JSON completi, documentazione SwaggerAuthenticationGen inclusa. Versione 1.1.1.